Webpack学习笔记(三)(基础配置详情)

本文详细介绍了Webpack的基本配置,包括入口起点(entry)、输出(output)、模块(module)等关键配置项的作用及使用方法,并深入探讨了多入口文件配置、优化配置等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、entry

entry: 入口起点

  1. string => ‘./src/index.js’ 单入口
    打包形成一个chunk,输出一个bundle文件,chunk名称默认为main
  2. array 多入口 所有入口文件最终只会形成一个chunk,输出出去只有一个bundle文件 =>
    只有在HRM功能中让html热更新生效(开发模块)
  3. object 多入口 有几个入口文件就形成几个chunk,输出几个bundle文件,chunk名称为对象的key值
1 entry: './src/index.js',
2 entry: './src/index.js',
3 entry: {
        index: './src/index.js',
        add: './src/add.js',
        count: './src/count.js'
},
特殊 entry: {
	 // 所有入口文件最终只会形成一个chunk,输出出去只有一个bundle文件
        index: ['./src/index.js','./src/count.js'],
     // 形成一个chunk,输出一个bundle文件。
        add: './src/add.js',
 },

2、output

output: {
     // 文件名称 (指定名称 + 目录)
     filename:'js/[name].js',
     // 输出文件目录(所有资源输出的公共目录)
     path: resolve(__dirname, 'build'),
     // 所有资源引入公共路径前缀 => 'imgs/a.jpg ==> /imgs/a.jpg' 一般用于生产环境
     publicPath: '/',
     chunkFilename:'js/[name]_chunk.js', // 非入口chunk的名称
     // library: '[name]', // 整个库向外暴露的变量名
     // libraryTarget: 'window', // 变量名添加到哪个上 browser
     // libraryTarget: 'global' // 变量名添加到哪个上 node
},

3、 module

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

4、resolve

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

配置后,引入文件可简写:import '$css/index'

5、dev server

devServer: {
	// 运行代码的目录
	 contentBase: resolve(__dirname, 'build'),
	 // 监视contentBase目录下的所有文件,一旦文件变化就会重载reload
	 watchContentBase: true,
	 watchOption: {
	     // 忽略文件
	     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':''
          }
      }
}

跨域问题:同源策略中不同的协议、端口号、域名就会产生跨域。
正常的浏览器和服务器之间有跨域,但是服务器之间没有跨域(浏览器和代理服务器之间没有跨域),代码通过代理服务器运行,浏览器把请求发送到代理服务器上,代理服务器替你转发到另外一个服务器上,所以请求成功。代理服务器再把接收到的响应给浏览器。这样就解决开发环境下的跨域问题。

6、optimization

output: {
    filename:'js/[name][contenthash:10].js',
    path: resolve(__dirname, 'build'),
    chunkFilename:'js/[name].[contenthash:10]_chunk.js' // 指定非入口文件的其他chunk的名字加上_chunk
},
optimization: {
	splitChunks: {
	     chunks:'all'
	      /* 以下都是splitChunks默认配置,可以不写
	     miniSize: 30 * 1024, // 分割的chunk最小为30kb(大于30kb的才分割)
	     maxSize: 0, // 最大没有限制
	     minChunks: 1, // 要提取的chunk最少被引用1次
	     maxAsyncRequests: 5, // 按需加载时并行加载的文件的最大数量为5
	     maxInitialRequests: 3, // 入口js文件最大并行请求数量
	     automaticNameDelimiter: '~', // 名称连接符
	     name: true, // 可以使用命名规则
	     cacheGroups: { // 分割chunk的组
	     vendors: {
	         // node_modules中的文件会被打包到vendors组的chunk中,--> vendors~xxx.js
	         // 满足上面的公共规则,大小超过30kb、至少被引用一次
	         test: /[\\/]node_modules[\\/]/,
	         // 优先级
	         priority: -10
	     },
	     default: {
	         // 要提取的chunk最少被引用2次
	         minChunks: 2,
	         prority: -20,
	         // 如果当前要打包的模块和之前已经被提取的模块是同一个,就会复用,而不是重新打包
	         reuseExistingChunk: true
	     }
	     } */
	 },
	 /*contenthash 缓存会导致一个问题:修改 a 文件导致 b 文件 contenthash 变化。
		因为在 index.js 中引入 a.js,打包后 index.js 中记录了 a.js 的 hash 值,
		而 a.js 改变,其重新打包后的 hash 改变,导致 index.js 文件内容中记录的 a.js 的 hash 也改变,
		从而重新打包后 index.js 的 hash 值也会变,这样就会使缓存失效。(
		改变的是a.js文件但是 index.js 文件的 hash 值也改变了)

	 */
	 // 将当前模块的记录其他模块的hash单独打包为一个文件 runtime
	 // 解决:修改a文件导致b文件的contenthash变化
	 runtimeChunk: {
	     name: entrypoint => `runtime-${entrypoint.name}`
	 },
	 minimizer: [
	     // 配置生产环境的压缩方案: js和css
	     new TerserWebpackPlugin({
	         // 开启缓存
	         // cache: true,
	         // 开启多进程打包
	         parallel: true,
	         // 启动source-map
	         // sourcemap: true
	     })
	 ]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值