webpack打包工具从零到精通

73 阅读3分钟

webpack打包工具从零到精通

认识webpack

webpack官方文档

1、  创建一个项目

2、  初始化项目npm init -y 生成一个package.json文件

3、  下载webpack依赖 npm i webpack , npm i webpack-cli -D

4、  npx webpack ./src/index.js --mode=development测试环境

5、  npx webpack ./src/index.js --mode=production 生产环境

配置核心概念

1、entry(入口)

指webpack从那个文件开始打包

2、output(输出)

指webpack导报完的文件输出到哪里去,如何命名

3、loader(加载器)

webpack本身只处理js,json等资源,其他资源需要借助loader,webpack才能解析

4、  plugins(插件)

扩展webpack的功能

5、  mode(模式)

主要两种模式:

开发模式:development

生产模式:production

6、  创建webpack.confing.js在项目根目录

const path = require('path'); // 专门用来加载nodeJS核心模块

module.exports = {
    // 入口压缩文件,相对路径
    entry: "./src/index.js", 
    // 输出
    output: {
        // 文件输出目录__dirname node的变量,代表当前文件夹目录
        path: path.resolve(__dirname, "dist"), //绝对路径
        // 文件名
        filename: "main.js",
    },
    // 加载器
    module:{
        rules:[
            // loader的配置
        ]
    },
    // 插件
    plugins: [],
    // 模式development(开发)production(生产)
    mode: "development",
}

处理资源

1、下载处理css资源能力 npm install --save-dev css-loader ts-loader npm i css-loader

    {
              test: /.css$/, //只是去检查css文件
              use: [ //执行顺序从右到左
               'style-loader', // 将js中css通过创建style标签添加到html中生效
                'css-loader',// 将css资源遍历到commonjs的模块到js中
              ],
            },

2、处理less资源 npm i less-loader

    {
                test: /.less$/,
                use: ['style-loader', 'css-loader',  'less-loader']
            }

3、  处理sass文件 npm install sass-loader sass webpack --save--dev

 {
                test: /.s[ac]ss$/,
                use: ['style-loader',
                 'css-loader',
                'Sass-loader' //将sass编译为css文件
                ]
            }

4、  图片打包base64

   {
                test: /.(png|jpe?g|gif|webp|svg)$/,
                type: 'asset',
               parser:{
                dataUrlCondition: {
                    // 小于200kb图片进行转换base64
                    // 优点减少请求
                    maxSize: 250 * 1024,
                }

5、  打包资源分类

    output: {
        // 文件输出目录__dirname node的变量,代表当前文件夹目录
        path: path.resolve(__dirname, "dist"), //绝对路径
        // 文件名
        filename: "static/js/main.js",
        clean: true //每次打包前删除原来的资源
    },
    
       {
                test: /.(png|jpe?g|gif|webp|svg)$/,
                type: 'asset',
               parser:{
                dataUrlCondition: {
                    // 小于200kb图片进行转换base64
                    // 优点减少请求
                    maxSize: 250 * 1024,
                }
               }, 
               generator:{
                filename: 'static/images/[hash:10][ext][query]'
            }
            }

ESlint配置

module.exports = {
// 解析选项
parserOptions:{},
// 具体检查规则
rules: {},
// 继承其他划
extends : [],
// 其他规则详见: https://zh-hans.eslint.org/docs/latest/use/getting-started
}

1、  vscode下载eslint代码检查插件,容易较早发现错误

2、  下载eslint资源包npm i eslint-webpack-plugin --save--dev

const eslintPlugin = require('eslint-webpack-plugin'); // 配置eslint

3、  配置eslint,通过plugins进行导入

// 插件 配置eslint检查文件
    plugins: [new eslintPlugin({
        context: path.resolve(__dirname, "src")
    })],

4、  在文件需要校验根目录进行配置.eslintrc.js

module.exports = {
    // 继承Eslint规则
    extends: ["eslint:recommended"],
    // 哪里进行适配
    env: {
        browser: true,
        node: true
    },
    parserOptions: {
        ecmaVersion: 6, //es6
        sourceType: 'module', //es module
    },
    // 自定义配置
    rules: {
        'no-var': 2, // 不能使用var
    }
  }

5、  配置不要检查eslint文件.eslintignore

dist //表示不检查dist文件

babel编译ts

1、  下载安装babel-loader依赖

npm install -D babel-loader @babel/core @babel/preset-env webpack

2、  配置在rules中, exclude不处理某个文件

  rules: [
    {
      test: /.m?js$/,
      exclude: /node_modules/, //排除不处理文件
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env'],
        },
      },
    },
  ];

处理html资源

1、  下载html资源打包依赖

npm install --save-dev html-webpack-plugin

2、  引入打包

const HtmlWebpackPlugin = require('html-webpack-plugin');

3、  在插件配置plugins中配置

new HTMLWebpack({
        // 模板,public/index.html创建模板
        // 新文件两个特别:1、结构与原来一致2、自动引入打包资源
        template: path.resolve(__dirname,'public/index.html')
    })],

开发模式自动化打包

1、  在module.exports配置devSever, 开发服务不会输出资源,在内存中进行编译打包

    devServer: {
        host: 'localhost', // 服务启动域名
        port: '3000', // 启动服务端口号
        open: true,  // 是否自动打开浏览器
      },

解决打包网页闪屏问题

1、  通过单独打包css实现,引入css打包组件

 npm install --save-dev mini-css-extract-plugin

2、  在组件中导入,进行初始化

const MiniCssExtractPlugin = require("mini-css-extract-plugin"); 
rules: [
            {
              test: /.css$/, //只是去检查css文件
              use: [ //执行顺序从右到左
              MiniCssExtractPlugin.loader, // 将js中css通过创建style标签添加到html中生效
                'css-loader',// 将css资源遍历到commonjs的模块到js中
              ],
            }
]

plugins: [new MiniCssExtractPlugin()],

解决css打包兼容性问题

1、  通过配置兼容 npm install --save-dev postcss-preset-env

{
              test: /.css$/, //只是去检查css文件
              use: [ //执行顺序从右到左
              MiniCssExtractPlugin.loader, // 将js中css通过创建style标签添加到html中生效
                'css-loader',// 将css资源遍历到commonjs的模块到js中
                {
                  loader: 'postcss-loader',
                  options: {
                    postcssOptions: {
                      plugins: [
                        [
                          'postcss-preset-env',
                          {
                            // 其他选项
                          },
                        ],
                      ],
                    },
                  },
                },
              ],
            },

2、  配置浏览器兼容在package.json

  "browserslist": [
  "last 2 version",
  ">1%", 
   "not dead"]

解决代码出错通过source-map计算

 devtool: 'source-map'

解决热模块更新HMR,在react中通过react-hot-loader

    devServer: {
        host: 'localhost', // 服务启动域名
        port: '3000', // 启动服务端口号
        open: true,  // 是否自动打开浏览器
        hot: true, // 开启热模块更新
      },

解决打包慢问题通过oneOf 、exclude(排除文件不处理)

   module:{
      rules: [
        // 提升打包速度
       {oneOf :[
        {
          test: /.css$/, //只是去检查css文件
          use: getStyleLoader(),
        },
        {
            test: /.less$/,
            use: getStyleLoader('less-loader')
        },
        {
            test: /.s[ac]ss$/,
            use: getStyleLoader('sass-loader')
        },
        {
            test: /.(png|jpe?g|gif|webp|svg)$/,
            type: 'asset',
           parser:{
            dataUrlCondition: {
                // 小于200kb图片进行转换base64
                // 优点减少请求
                maxSize: 250 * 1024,
            }
           }, 
           generator:{
            filename: 'static/images/[hash:10][ext][query]'
        }
        },
        {
            test: /.m?js$/,
            exclude: /node_modules/, //排除不处理文件
            use: {
              loader: 'babel-loader',
              options: {
                presets: ['@babel/preset-env'],
              },
            },
          }, 
       ],
        
      },         
      ],
    },

多进程打包