webpack---loader,plugins,mode

本文深入讲解Webpack的高级配置技巧,包括常用插件如CommonsChunkPlugin、UglifyjsWebpackPlugin的功能,loaders如babel-loader的使用,以及mode、资源解析、文件监听、热更新、文件指纹策略和代码压缩的详细配置方法。

常用的plugins:                                                                                                                                                                                CommonsChunkPlugin:将chunks相同的模块代码提取成公共js                                                                                          CleanWebpackPlugin:清理构建目录                                                                                                                                                  ExtractTextWebpackPlugin:将CSS从bundle文件里提取成一个独立的css文件                                                                                  CopyWebpackPlugin:将文件或者文件夹拷贝到构建的输出目录                                                                                                      HtmlWepackPlugin:创建html文件去承载输出的bundle                                                                                                                    UglifyjsWebpackPlugin:压缩JS                                                                                                                                                        ZipWebpackPlugin:将打包出的资源生成一个zip包

 

常用的loaders:                                                                                                                                                                               

  //loader:是一个转换器,将文件A(webpack不能解析)编译成文件B
  module:{
    rules:[//test指定匹配规则,use指定loader名称
      {
        test:/.js$/,
        use:'babel-loader'
      }
    ]
  },

 

mode的内置函数功能 :                                                                                                                                                                    development:设置process.env.NODE_ENV的值为development,开启NamedChunksPlugin和NameModulesPlugin                  production:设置process.env.NODE_ENV的值为 production,开启FlaggDependencyUsagePlugin,FlagIncludedChunksPlugin,ModuleConcatencyUsagePlugin,NoEmitOnErrorsPlugin,OccurrenceOrderPlugin,SideEffectsFlagPlugin和TerserPlugin.                                                                                                                                              none:不开启任何优化选项 

资源解析Less和Sass                                                                                                                                                                        

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

解析图片和字体:file-loader  或  url-loader(可设置较小资源自动base64)                                                                                          url-loader: 页面图片较多,发很多http请求,会降低页面性能。这个问题可以通过url-loader解决。url-loader会将引入的图片编码,生成dataURI并将其打包到文件中,最终只需要引入这个dataURL就能访问图片。url-loader提供了limit参数,小于limit字节的文件会被转为DataURI,大于limit的还会使用file-loader进行copy。                                                                                                url-loader内部封装了file-loader,若安装了url-loader,就不需要安装filr-loader 

文件监听:文件监听是在发现源码发生变化时,自动重新构建出新的输出文件。                                                                              开启监听模式的方法:启动webpack命令时,带上--watch参数或在配置webpack.config.js中设置watch:true                                  

//package.json
"script":{
   "watch": "webpack --watch"
}

 

//文件监听的原理分析
//某个文件发生了变化,并不会立刻告诉监听者,而是先缓存起来,等aggreateTimeout
module.export = {
   //默认false,也就是不开启
   watch:true,
   //只有开启监听模式时,watchOptions才有意义
   watchOptions:{
      //默认为空,不监听的文件或者文件夹,支持正则匹配
      ignored:/node_modules/,
      //监听到变化发生后会等300ms再去执行,默认300ms
      aggregateTimeout:300,
      //判断文件是否发生变化是通过不停询问系统指定文件有没有变化实现,默认每秒问1000次
      poll:1000
   }
}

热更新:webpack-dev-server                                                                                                                                                        使用HotModuleReplacementPlugin插件,WDS不刷新浏览器,WDS不输出文件,而是放在内存中                 

//package.json
"dev":"webpack-dev-serve --open"

//webpack.config.js
mode:'development',
plugins:[
  new webpack.HotModuleReplacementPlugin
],
devServer:{
  contentBase:'./dist',
  hot:true
}

WDM将webpack输出的文件传输给服务器,适用于灵活的定制场景。(webpack-dev-middleware)                                             热更新的原理:webpack compile:将js编译成bundle,HMR Server:将热更新的文件输出给HMR Runtime,Bundle server:提供文件在浏览器的访问,HMR Runtime:会被注入到浏览器,更新文件的变化,bundle.js:构建输出的文件。 

文件指纹策略:用于做版本管理,文件指纹指的是打包输出的文件名后缀                                                                                        文件指纹如何生成:hash:和整个项目的构建相关,只要项目文件有修改,整个项目构建的hash值就会改变;Chunkhash:和webpack打包的chunk有关,不同的entry会生成不同的chunkhash值。Contenthash:根据文件内容来定义hash,文件内容不变,则contenthash不变                                                                                                                                                                      js:设置output的filename,使用[chunkhash]                                                                                                                                      css:设置MiniCssExtractPlugin的filename,使用[contenthash]                                                                                                          图片:设置file-loader的name,使用[hash]                                                                                                                                                  [ext]:资源后缀名                                                                                                                                                                              [name]:文件名称                                                                                                                                                                              [path]:文件的相对路径                                                                                                                                                                      [folder]:文件所在的文件夹                                                                                                                                                                [contenthash]:文件的内容hash,默认是md5生成                                                                                                                            [content]:文件的内容hash,默认是md5生成                                                                                                                                    [emoj]:一个随机的指代文件内容的emoj  

代码压缩                                                                                                                                                                                            html压缩                                                                                                                                                                                               js压缩    :uglifyjs-webpack-plugin                                                                                                                                                     css压缩:optimize-css-assets-webpack-plugin   ,同时使用cssnano                                                                                               html压缩:修改html-webpack-plugin,设置压缩参数

<think> 我们面临的问题是:项目同时存在 vue-loader 15.11.1 和 17.4.2 以及 webpack 5.76.0,需要修改配置使项目正常运行。 根据引用[1]和[2]可知,vue-loader v15 是为 Webpack 4 设计的,而 vue-loader v16 及以上是为 Webpack 5 设计的。 因此,我们需要统一版本,要么降级Webpack到4,要么升级vue-loader到16以上以适应Webpack 5。 但当前项目中同时存在两个版本的vue-loader(15和17),这会导致冲突。我们需要选择一个方向: 方案一:将项目整体迁移到Webpack 5(使用vue-loader v17) 方案二:将项目降级到Webpack 4(使用vue-loader v15) 考虑到项目已经安装了webpack 5.76.0,且vue-loader 17.4.2也已安装,但可能配置不正确,我们选择方案一(升级)更合理。 然而,引用[4]提到“vue-loader-v16”包,实际上vue-loader v16和v17都是用于Webpack 5的,只是v17是Vue 3专用的,v16同时支持Vue 2和3(但需要额外配置)。但根据引用[5]可知,Vue 2项目使用TypeScript时可能会遇到插件兼容性问题。 因此,我们需要确认项目使用的Vue版本: - 如果是Vue 2项目,应使用vue-loader v15(Webpack4)或vue-loader v16(Webpack5) - 如果是Vue 3项目,必须使用vue-loader v16+ 由于用户的问题描述中同时出现了两个版本的vue-loader,我们首先需要移除冲突的版本,并统一使用一个版本。 步骤: 1. 确定Vue版本: 检查package.json中"vue"的版本: - 2.x.x:Vue 2 - 3.x.x:Vue 3 2. 根据Vue版本决定vue-loader版本: - Vue 2:使用vue-loader v15(配合Webpack4)或vue-loader v16(配合Webpack5) - Vue 3:必须使用vue-loader v16以上(配合Webpack5) 3. 移除现有的vue-loader,安装指定版本。 4. 调整webpack配置。 由于问题描述中同时出现了webpack 5和vue-loader 15(不兼容),所以我们需要调整。 假设项目使用的是Vue 2,我们可以有两种选择: A) 降级webpack到4,使用vue-loader 15(如用户之前的问题) B) 升级vue-loader到16,保持webpack5(需要额外配置) 如果项目是Vue 3,则必须使用vue-loader v16以上和webpack5。 考虑到用户之前的问题是关于Webpack4的兼容性,但现在项目已经升级到webpack5,我们更倾向于选择方案B(升级vue-loader到16)以保持webpack5。 具体步骤: 1. 移除旧版本vue-loader,安装正确版本: - 如果是Vue2,安装vue-loader v16(最后一个支持Vue2的版本是16.8.3,根据官方文档,16.x支持Vue2和3,但17.x仅支持Vue3) - 如果是Vue3,安装最新版vue-loader(17.x) 2. 更新vue-template-compiler(Vue2)或@vue/compiler-sfc(Vue3) 3. 修改webpack配置,使用VueLoaderPlugin(注意引入方式可能有变化) 4. 确保其他loader兼容Webpack5。 根据引用[2]和[4],我们配置如下: 由于问题中同时存在两个版本,我们先清理: ```bash npm uninstall vue-loader ``` 然后安装对应版本: 情况1:Vue 2项目(使用webpack5) ```bash npm install vue-loader@16.8.3 --save-dev npm install vue-template-compiler --save-dev # 版本必须与vue版本一致 ``` 情况2:Vue 3项目 ```bash npm install vue-loader@17.4.2 --save-dev npm install @vue/compiler-sfc --save-dev # 版本与vue版本一致 ``` 然后在webpack配置中引入插件(注意v16和v17的引入方式相同): ```javascript const { VueLoaderPlugin } = require('vue-loader') module.exports = { // ... 其他配置 module: { rules: [ { test: /\.vue$/, loader: 'vue-loader' }, // 其他规则... ] }, plugins: [ new VueLoaderPlugin() ] } ``` 另外,注意css-loader的版本:Webpack5要求css-loader v5以上,但v6可能会有问题,建议使用v5(如果遇到问题)。引用[3]提到css-loader和style-loader的安装。 所以,总结步骤: 1. 查看package.json中vue的版本,确定是Vue2还是Vue3。 2. 卸载现有的vue-loader。 3. 根据Vue版本安装指定版本的vue-loader和编译器。 4. 修改webpack.config.js,确保已正确配置VueLoaderPlugin。 5. 检查其他loader(如css-loader、style-loader)是否兼容Webpack5。 注意:如果项目使用TypeScript,引用[5]提到@vue/cli-plugin-typescript可能依赖特定版本的fork-ts-checker-webpack-plugin。如果遇到问题,可能需要降级@vue/cli-plugin-typescript或调整配置。 最后,重新启动项目。 如果选择降级Webpack到4(方案A),则步骤如下: 1. 降级webpack到4: ```bash npm install webpack@4 webpack-cli@3 webpack-dev-server@3 --save-dev ``` 2. 安装vue-loader 15: ```bash npm install vue-loader@15.9.8 --save-dev ``` 3. 确保vue-template-compiler版本与vue一致。 但是,由于用户已经安装了webpack5,且项目可能已经使用了webpack5的特性,降级可能会有额外风险。 因此,我们优先推荐方案B(升级vue-loader)以适应webpack5。 注意:vue-loader v16和v17的配置基本相同,但vue-loader v17需要配合@vue/compiler-sfc(Vue3),而vue-loader v16配合vue-template-compiler(Vue2)或@vue/compiler-sfc(Vue3)。 由于用户的问题中没有明确Vue版本,我们需要用户自行确认。以下配置假设为Vue2(因为vue-template-compiler是Vue2的编译器): 如果package.json中vue是2.x,则执行: ```bash # 移除现有的vue-loader npm uninstall vue-loader # 安装vue-loader v16(兼容Vue2和Webpack5) npm install vue-loader@16.8.3 --save-dev # 确保vue-template-compiler版本与vue一致,例如vue是2.6.14,则: npm install vue-template-compiler@2.6.14 --save-dev ``` 然后修改webpack配置,确保已经使用了VueLoaderPlugin(如上所示)。 同时,检查其他loader的兼容性,特别是css-loader和style-loader。对于Webpack5,css-loader可以使用v5或v6,但style-loader需要v2以上(推荐v3.3.1)。如果遇到问题,可以尝试: ```bash npm install css-loader@5.2.7 style-loader@2.0.0 --save-dev ``` 最后,重新运行项目。 如果项目是Vue3,则执行: ```bash npm uninstall vue-loader npm install vue-loader@17.4.2 --save-dev npm install @vue/compiler-sfc@3.2.47 --save-dev # 版本与vue一致 ``` 注意:Vue3不需要vue-template-compiler,而是使用@vue/compiler-sfc。 如果遇到其他插件问题(如fork-ts-checker-webpack-plugin),可能需要根据引用[5]的提示降级@vue/cli-plugin-typescript或等待兼容版本。 由于问题描述中没有提到TypeScript,我们可以先不考虑。 因此,关键步骤总结: 1. 确定Vue版本 2. 安装对应的vue-loader和编译器 3. 配置webpack 4. 确保其他loader兼容 根据引用[2]的配置示例,我们确保在webpack配置中正确引入了VueLoaderPlugin并配置了.vue文件的loader。 如果还有问题,请检查控制台错误信息,可能需要调整其他loader或plugin的版本。 </think> 要解决项目中 `vue-loader` 15.11.1 与 17.4.2、`webpack` 5.76.0 共存导致的冲突问题,请按以下步骤操作: --- ### 🔧 解决方案:统一 vue-loader 版本 #### 步骤1:移除冲突依赖 ```bash # 移除当前冲突的 vue-loader 版本 npm uninstall vue-loader # 安装兼容 Webpack 5 的 vue-loader v16(Vue 2 项目) npm install vue-loader@16.8.3 --save-dev # 或 Vue 3 项目使用 npm install vue-loader@17.4.2 --save-dev ``` #### 步骤2:安装必要依赖 ```bash # Vue 2 项目 npm install vue-template-compiler@^2.6.14 --save-dev # Vue 3 项目 npm install @vue/compiler-sfc@^3.2.0 --save-dev ``` #### 步骤3:修改 webpack 配置 ```javascript title="webpack.config.js" const { VueLoaderPlugin } = require('vue-loader'); module.exports = { //... module: { rules: [ { test: /\.vue$/, loader: 'vue-loader', options: { /* Vue 2 需要此配置 */ } }, { test: /\.css$/, use: ['vue-style-loader', 'css-loader'] } ] }, plugins: [ new VueLoaderPlugin() // 必须添加[^2] ], resolve: { alias: { // Vue 2 需要此别名 vue$: 'vue/dist/vue.esm.js' } } }; ``` --- ### ⚠️ 关键兼容性配置 | 依赖 | Vue 2 项目 | Vue 3 项目 | |------------------|-------------------------------|-------------------------------| | vue-loader | `16.8.3` (兼容 Vue 2 & Webpack 5) | `17.4.2` (仅支持 Vue 3) | | 编译器 | `vue-template-compiler@2.6.14` | `@vue/compiler-sfc@3.2.47` | | Vue 别名 | `vue$: 'vue/dist/vue.esm.js'` | 不需要 | | CSS 加载器 | `vue-style-loader` + `css-loader@5` | `vue-style-loader` + `css-loader` | --- ### ✅ 验证步骤 1. **检查依赖树**: ```bash npm list vue-loader webpack vue-template-compiler ``` 2. **Vue 版本匹配验证**: ```javascript title="version-check.js" console.log('Vue版本:', require('vue/package.json').version) console.log('编译器版本:', require('vue-template-compiler/package.json').version) ``` 3. **运行构建**: ```bash npx webpack --mode development ``` --- ### 🚫 常见错误修复 1. **`VueLoaderPlugin` 未定义**: ```javascript // 错误写法 const VueLoaderPlugin = require('vue-loader/lib/plugin') // 正确写法 const { VueLoaderPlugin } = require('vue-loader') ``` 2. **组件渲染错误**: ```javascript // 在 webpack 别名中添加 resolve: { alias: { 'vue$': 'vue/dist/vue.esm.js' // Vue 2 必须配置 } } ``` 3. **样式加载失败**: ```bash npm install css-loader@5.2.7 style-loader@2.0.0 --save-dev ``` > **关键原则**: > - Vue 2 项目必须使用 `vue-loader` v16,**不能使用 v17**[^4] > - Vue 2 必须配对 `vue-template-compiler` 且版本严格等于 Vue 版本 > - Webpack 5 需要 CSS loader v5+[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值