1、根据不同的文件执行不同的脚本进行打包

  1. ├── build # 根目录
  2. ├── webpack.dev.js //开发环境执行的文件
  3. └── webpack.prod.js // 生产环境执行的文件
  4. ├── package.json # 根目录
  5. ├── node_modules # 根目录
  6. ├── src # 根目录
  7. ├── two.js
  8. └── index.js

配置 script 脚本

  1. // package.json
  2. script:{
  3. "dev":"webpack --config ./build/webpack.dev.js",
  4. "build":"webpack --config ./build/webpack.prod.js"
  5. }

为不同文件指定打包所需的东西

  1. // webpack.dev.js
  2. modules.exports={
  3. mode:"development",
  4. }
  5. // webpack.prod.js
  6. modules.exports={
  7. mode:"production'
  8. }

2、将公共文件抽出放在公共文件内

//package.json
script:{
 "dev":"webpack --env.development --config ./build/webpack.base.js",
  "build":"webpack --env.production --config ./build/webpack.base.js"
}
//webpack.base.js
const path = require("path"); // node自带模块,可直接引入
const merge = require("webpack-merge"); //第三方包,可以将两个文件内容合并而不会出现覆盖的情况
const dev = require("./webpack.dev");
const prod = require("./webpack.prod");
const base = {
    entry: path.resolve(__dirname,"../src/index.js"),
    output:{
        filename:'[name].js',
        path:path.resolve(__dirname,'../dist'),
    }
}
module.exports=(env)=>{
    if (env.production) {
        merge(base,prod)
    }else{
        merge(base,dev)
    }
}

//webpack.dev.js
module.exports = {
    mode: "development",
    devServer: {
        // 更改静态文件目录位置
        contentBase: path.resolve(__dirname, '../dist'),
        compress: false, // 是否开启 gzip 压缩,
        port: 3000, //开启服务之后的端口号 
        hot: true, // 是否启用热更新
        proxy: { // 后台服务器代理路由
            '/api': {
                target: 'http://localhost:4000',
            },
        }
    }
}

3、include跟exclude

在打包的时候有些东西打包的时候不希望走 loader ,因为这样会导致导致打包过慢,所以就需要忽略一些东西

// webpack.base.js
const base = {
    entry: path.resolve(__dirname, "../src/index.js"),
    output: {
        filename: '[name].js',
        path: path.resolve(__dirname, '../dist'),
    },
    module: {
        rules: [{
            test: /\.js$/,
            use: "babel-loader",
            exclude: /node_modules/,
            include:path.resolve(__dirname,'src'),// 这个选项意思是指定的目录下一定要走loader,进行转化
        }]
    }
}

4、多线程打包,解决打包慢的问题

由于打包的时候是同步并且会按照依赖一步步找文件,这样在大项目中,打包会很慢,所以我们可以将不同的文件逻辑交给不同的 loader

//  npm install --save-dev happypack

//webpack.base.js
const HappyPack = require("happypack");

const base = {
  module:{
       rules:[
              {
                    test:/\.js$/,
          use:'happypack/loader?id=jsx'
        }
              {
                    test:/\.less$/,
          use:'happypack/loader?id=style'
        }
     ]
  },
  plugins:[
      new HappyPack({
       id:"jsx", // 这个是根据上面规则匹配携带的参数判断
       threads: 4, // 这个是处理匹配的文件的线程数
       loader:["babel-loader"]
    }),
    new HappyPack({
       id:"style", // 这个是根据上面规则匹配携带的参数判断
       threads: 2, // 这个是处理匹配的文件的线程数
       loader:["style-loader","css-loader","less-loader"]
    }),
  ]
}