淘先锋技术网

首页 1 2 3 4 5 6 7

Webpack相关文章

entry

1.string类型

  • 单入口
  • 打包形成一个chunk
  • 输出一个bundle文件。此时chunk的默认名称是main
module.exports = {
  entry: './src/index.js',
  ...
}

2.array类型

  • 多入口
  • 所有入口文件最终只会形成-一个chunk,输出出去只有一个bundle文件
  • 只有在HMR功能中让html热更新生效
module.exports = {
  entry: ['./src/index.js', './src/add.js'],
  ...
}

3.object类型

  • 多入口
  • 有几个入口文件就形成几个chunk,输出几个bundle文件
  • 此时chunk的名称是key
module.exports = {
  entry: {
    index:  './src/index.js',
    add: './src/add.js'
  },
  ...
}

4.特殊用法

module.exports = {
  entry: {
    //所有入口文件最终只会形成一个chunk,输出出去只有一个bundle文件
    index:  ['./src/index.js', './src/count.js'],
    //形成一个chunk,输出一个bundle文件。
    add: './src/add.js'
  },
  ...
}

output

module.exports = {
  ...
  output:{
    // 文件名称 (指定名称+目录)
    filename: ' js/[name].js',
    //输出文件目录(将来所有资源输出的公共目录)
    path: resolve(__dirname, 'build'),
    //所有资源引入公共路径前缀(比如html中引入js)--> 'imgs/a.jpg' --> '/imgs/a.jpg'
    publicPath: '/',
    chunkFilename: '[name]_chunk.js', //非入口chunk的名称 比如通过import语法引入的文件
    // libraryTarget: 'window' //变量名添加到哪个上 browser
    // libraryTarget: 'global' //变量名添加到哪个上 node
    libraryTarget: 'commonjs'
  }
	...
}

module

module.exports = {
  ...
  module: {
    rules: [
      {
        test: /\.css$/
        user: ['style-loader', 'css-loader']
      },
  		{
        test: /\.js$/,
  			// 排除node_modules下的js文件
  			exclude: /node_module/,
  			// 只检查src下的js文件
  			include: resolve(__dirname, 'src'),
        //优先执行
				enforce: 'pre',
        //延后执行
				// enforce: post
        // 单个loader用loader
        loader: 'eslint-loader',
        options: {}
      },
      {
        // 以下配置只会生效一个
        oneOf: []
      }
    ]
  }
}

resolve

module.exports = {
  ...
  // 解析模块的规则
  resolve: {
  	// 配置解析模块路径别名 
    // 优点:简写路径缺点路径没有提示
    alias:{
      $css: resolve(__dirname, 'src/css')
    },
    // 配置省略文件路径的后缀名
    extensions: ['.js', '.json', '.jsx'],
    // 告诉webpack解析模块是去找哪个目录
    modules: [reslove(__dirname, '../../node_modules'), 'node_modules']
  }
}

devServer

module.exports = {
  ...
  devServer: {
    // 运行代码的目录
		contentBase: resolve (__dirname, 'build'),
    // 监视contentBase 目录下的所有文件,一旦文件变化就会reload,重新打包
    watchContentBase: true,
    watchOptions:{
      //忽略文件
      ignored: / node_ modules/
    },
    // 启用gzip压缩
    compress: true,
    port: 5000,
    host: 'localhost',
    // 自动打开浏览器
    open: 'true',
    // 开启HMR功能
    hot: true,
    // 不要显示启动服务器日志信息
    clientLogLevel: 'none',
    // 除了一些基本启动信息以外,其他内容都不要显示
    quiet: true,
    // 如果出错了,不要全屏提示
    overlay: false,
    // 服务器代理--> 解决开发环境跨域问题
    proxy: {
      // 一旦devServer(5000)服务器接受到/api/xxx 的请求,就会把请求转发到另外一个服务器(3000). 
      '/api':{
				target: 'http://localhost:3000',
 				//发送请求时,请求路径重写:将/api/xxx --> /xxx (去掉/api)
        pathRewrite:{
        	'^/api': ''
        }
    }
  }
}

optimization

const TerserWebpackPlugin = require('terser -webpack-plugin' )

module.exports = {
  ...
  mode: 'production',
  optimization: {
    splitChunks: {
      chunks: 'all',
      //以下为默认值
      /*
      minSize: 30 * 1024, // 分割的chunk最小为30kb
      maxSize: 0, // 最大没有限制
      minChunks: 1, // 要提取的chunk至少被引用一次
      maxAsyncRequest: 5, //按需如载时并行加载的文件的最大数量
      maxInitialRequest: 3, //入口js.文件最大并行请求数量
      automaticNameDelimiter: '~', // 名称连接符
      name : true, //可以使用命名规则
      cacheGroups: { // 分割chunk的组
        // node_modules文件会被打包到 vendors 组的chunk中。--> vendors~xxx.js
        //满足上面的公共规则,如:大小超过30kb, 至少被引用一次。
        vendors:{
          test: /[\\/ ]node_ modules[\\/]/,
          // 打包优先级为-10
          priority: -10
        },
        default: {
          //要提取的chunk最少被引用2次
          minChunks: 2,
          //优先级
          priority: -20,
          //如果当前要打包的模块,和之前已经被提取的模块是同一个,就会复用,而不是重新打包模块
          reuseExistingChunk: true
        }
      }
      */
    },
    // 将当前模块的记录其他模块的hash单独打包为一一个文件runtime
    // 解决: 修改a文件导致b文件的contenthash变化,并且发生重新打包的现象
    runtimeChunk: {
      name: entrypoint => `runtime-${entrypoint.name}`
    },
    minimizer:[
      //配置生产环境的压缩方案: js和css
      new TerserWebpackPlugin({
				//开启缓存
				cache: true,
				//开启多进程打包
    		parallel: true,
    		//启动source-map
    		sourceMap: true
      })
  ]
}