美文网首页
浅析webpack

浅析webpack

作者: Marshall3572 | 来源:发表于2021-03-26 20:12 被阅读0次

    使用下面这行命令进行全局安装

    npm install -g webpack@4 webpack-cli@3
    //或
    yarn global add webpack@4 webpack-cli@3
    

    用webpack转义JS

    npm init -y
    
    yarn add webpack@4 webpack-cli@3 --dev
    

    下面我们来运行webpack,由于webpack不是全局安装,它在node_modules/.bin/webpack

    所以我们调用本地安装的webpack时应该加上路径。

    ./node_modules/.bin/webpack --version
    

    但是这样不够方便,
    可以使用下边这条命令,自动寻找本地webpack地址。

    npx webpack
    
    (先忽略警告)生成了一个main.js文件,是我们Index.js的转义

    但是npx不够稳定,在windows下不一定能用。

    初始化webpack.config.js
    现在我们来尝试消除上边出现的webpack警告,当我们仔细观察报错,发现是configuration的问题,于是我们在官方文档中查询。

    直接将这段代码复制到本地,
    var path = require('path');
    
    module.exports = {
      mode: 'development',
      entry: './foo.js',
      output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'foo.bundle.js',
      },
    };
    

    但是并不是这段代码中所有内容我们都是需要的,我们只保留修改报错的部分。

    var path = require('path');
    
    module.exports = {
      mode: 'development'
    };
    
    再次运行webpack,成功消除报错
    但是我们发现在development模式下,main,js被改变了 但是如果我们把mode修改成production,main.js又变回了原来的样子 下边这种方式没有注释体积更小,上边那种方式方便开发者阅读和debug 。

    理解文件名中的hash的用途

    webpack 配置 entry和output
    我们将上边那段代码修改一下

    var path = require('path');
    module.exports = {
      mode: 'development',
      entry: './src/index.js',
      output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'main.js',
      }
    };
    

    这段代码的作用就是配置转移后的JS文件的入口、出口。

    HTTP缓存的意义
    我们修改config的代码如下:

    var path = require('path');
    
    module.exports = {
      mode: 'development',
      entry: './src/index.js',
      output: {
        path: path.resolve(__dirname, 'dist'),
        filename: '[name].[contenthash].js',
      }
    };
    

    转义的JS文件名改变,这里我们就需要理解HTTP缓存的意义。
    HTTP缓存可以避免重复下载相同文件,加快访问网站速度。
    但是一定要记住不能让首页index.html缓存,因为如果首页都缓存了,那么我们就无法知道其他页面是否需要更新。
    当我们修改文件内容时,文件名的hash就会改变,提示我们缓存不能使用了要更新。

    可是每当我们修改文件后运行一次

    npx webpack
    
    就会在dist目录下生成一个新的js文件,时间久了该目录下的JS文件就会越来越多,所以我们每次运行webpack的时候都要删除dist目录,可是手动删除太麻烦了而且可能会忘,所以我们修改一下package.json就好。

    webpack插件自动生成HTML

    官方文档
    安装插件

    yarn add html-webpack-plugin --dev
    

    观察一下官方文档给的使用方法,自己整合一下。



    如果在配置plugin和loader部分遇到报错时,复制下边这段代码到package.json,然后删除node_modules文件,再yarn install,再次重试即可。(注意webpack 、 webpack-cli版本号等内容要和自己本地一致)

    {
      "name": "webpack-demo-1",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "start": "webpack-dev-server",
        "build": "rm -rf dist && webpack --config webpack.config.prod.js",
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
      "devDependencies": {
        "css-loader": "^3.2.0",
        "dart-sass": "^1.23.7",
        "file-loader": "^5.0.2",
        "html-webpack-plugin": "^3.2.0",
        "less": "^3.10.3",
        "less-loader": "^5.0.0",
        "mini-css-extract-plugin": "^0.8.0",
        "sass-loader": "^8.0.0",
        "style-loader": "^1.0.1",
        "stylus": "^0.54.7",
        "stylus-loader": "^3.0.2",
        "webpack": "4.46.0",
        "webpack-cli": "3.3.12",
        "webpack-dev-server": "^3.9.0"
      }
    }
    
    

    webpack引入CSS

    1. 使用JS生成style

    yarn add style-loader --dev
    yarn add css-loader --dev
    

    记住,我们安装的loader版本要和package.json里对应。
    可以使用JS生成style,也可以把CSS抽成文件。

    如何预览呢?

    cd dist
    http-server . -c-1
    

    为了方便我们快速开发,使用webpack-dev-server
    webpack-dev-server不依赖dist目录文件,他直接在内存中就搞定了,不需要放到硬盘上,所以速度很快(比build方便)。
    和http-server相比较,webpack-dev-server集成了更多的功能,自动刷新等。
    对着文档CRM吧...
    yarn add webpack-dev-server --dev
    

    添加下图代码


    devtool: 'inline-source-map',
      devServer: {
        contentBase: './dist',
      }
    
     "start": "webpack-dev-server --open",
    

    完成,然后开始运行。
    yarn start

    2. 使用插件提取CSS文件
    CRM官方文档MiniCssExtractPlugin

    yarn add mini-css-extract-plugin --dev
    

    使用两个webpack config文件

    这么多插件、内容,如何学习呢?
    仍然是CRM学习法(文档放到本地成功了以后修微调一下再跑),Google关键词看文档。

    如果我们在生产环境需要上传代码,我们就使用yarn build

    而在开发环境下自己测试,就使用yarn start 那我们能否用不同的config将它们分开呢,这样我们就可以切换两个插件了。

    在两种不同模式下采用不同的config。
    开发者模式下

      mode: 'development',
    

    生产模式下

      mode: 'production',
    

    但是我们会发现,这两种模式下,两个文件的代码基本都是相同的,我们没必要写成两个文件,而是应该采用继承的方式。
    开发模式下大部分继承base,生产模式下

    webpack的作用包括:

    1. 压缩代码
    2. 将一个或多个JS文件打包成对应的文件(webpack本身只能打包commonjs规范的JS文件,无需安装额外 loader,webpack 自带此功能)
    3. 将一个或多个CSS文件打包成对应的文件
    4. 将高版本的JS转译成低版本的JS

    webpack-dev-server 的作用包括:

    1. 提供server方便开发预览
    2. 文件内容变化自动转译代码,并刷新页面

    webpack 将 CSS 代码提取成单独的文件,需要用到什么 plugin?
    MiniCssExtractPlugin

    webpack 将 CSS 文件引入到 JS 中,并转为 style 标签插入到 head 标签里,需要用到什么 loader?
    css-loader 和 style-loader

    loader vs plugin

    loader:一对一,一个文件转化成另一个文件。
    plugin:多对一,多个文件转化成一个文件。
    loader和plugin有什么区别呢?
    loader就是加载器(用来load一个文件),plugin就是插件(加强功能——外挂,虽然loader也变相的拓展了webapck,但是它只是专注于转化文件这一个领域,而plugin的功能更加丰富,不仅局限于资源的加载)。
    plugin:一定要记住html-webpack-plugin(生成HTML文件) 和 MiNiCssExtractPlugin(抽取css代码把他变成一个文件)

    引入SCSS

    任意一个CSS文件的后缀直接改掉,就是一个SCSS。
    node-sass已经过时,请使用dart-sass。
    CRM开始整sass-loader文档

    yarn add sass-loader dart-sass --dev
    

    引入LESS和Stylus

    yarn add less-loader --dev
    

    less-loader文档

    yarn add stylus-loader stylus --dev
    

    SASS, LESS, Stylus完全没有区别。

    使用file-loader引入图片

    yarn add file-loader stylus --dev
    

    作用是把文件变成文件路径

    webpack import()懒加载

    如何实现懒加载:用import()去加载一个文件,会得到一个promise(因为异步),promise.then前边写成功函数,后边写失败函数。

    webpack一键部署到github

    我们不一定只有在dist目录里才能预览,这里介绍一种新方法。

    //新建一个分支
    git branch gh-pages
    //进入一个分支
    git checkout gh-pages
    
    把所有源代码都删掉

    把dist里边的文件都拷贝到当前目录然后删除dist

    mv dist/* ./
    rm -rf dist
    

    这样我们就有两个分支了,master分支用来存源代码,gh-pages用来预览。

    虽然成功了,可是每次上传都要(删除源代码->dist目录文件移出->删除dist目录),这样也太麻烦了吧。

    为了方便,我们可以使用脚本

    相关文章

      网友评论

          本文标题:浅析webpack

          本文链接:https://www.haomeiwen.com/subject/whvlhltx.html