vue大型项目(webpack 4.x)本地开发构建速度优化之cache-loader,亲测有效

前言
cache-loader是webpack在打包编译过程中对打包的文件设置的缓存策略。它会在每次加载源文件之前检查是否有已缓存的结果,如果存在,则直接复用,否则才执行实际的加载操作并保存结果到缓存中。这种设计模式对于频繁变动的代码库尤其有用,因为大部分文件在多次构建时通常是不变的。

1、安装依赖

npm i cache-loader -D

2、在vue.config.js文件中,找到chainWebpack加入如下配置

module.exports = {
	chainWebpack: (config) => {
		if (process.env.NODE_ENV === 'development') {  // 只针对开发环境
	      // ========== JavaScript 文件配置 ==========
	      config.module
	        .rule('js')
	        .test(/\.m?jsx?$/)
	        .use('cache-loader')
	        .loader('cache-loader')
	        .before('babel-loader') // 确保在 babel-loader 之前
	        .end()
	      // ========== TypeScript 文件配置 ==========
	      config.module
	        .rule('ts')
	        .test(/\.tsx?$/)
	        .use('ts-loader')
	        .loader('ts-loader')
	        .options({
	          appendTsSuffixTo: [/\.vue$/],
	          transpileOnly: true // 建议开启以提高性能
	        })
	        .end()
	        .use('babel-loader')
	        .loader('babel-loader')
	        .end()
	        .use('cache-loader')
	        .loader('cache-loader')
	      // ========== Vue 文件配置 ==========
	      config.module
	        .rule('vue')
	        .use('cache-loader')
	        .loader('cache-loader')
	        .before('vue-loader')
	        .end()
	    }
	})
}

3、重新启动项目,修改文件,查看构建速度是否提升

参考文章:
https://blog.youkuaiyun.com/gitblog_00037/article/details/137737148

更多问题的探讨,请加入vue技术交流群(864583465) (此群满可加2群:111822407),你的问答将是我们大家共同进步的关键!!!

in ./node_modules/_fast-png@6.4.0@fast-png/lib-esm/PngDecoder.js Module parse failed: Unexpected token (10:13) You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders | import { ColorType, CompressionMethod, DisposeOpType, FilterMethod, InterlaceMethod, BlendOpType, } from './internalTypes'; | export default class PngDecoder extends IOBuffer { > _checkCrc; | _inflator; | _png; @ ./node_modules/_fast-png@6.4.0@fast-png/lib-esm/index.js 1:0-38 6:24-34 14:24-34 @ ./node_modules/_jspdf@3.0.3@jspdf/dist/jspdf.es.min.js @ ./node_modules/_html2pdf.js@0.12.1@html2pdf.js/dist/html2pdf.js @ ./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--13-0!./node_modules/_babel-loader@8.4.1@babel-loader/lib!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--1-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options!./src/views/srm/materialcert/MaterialCertDetail.vue?vue&type=script&lang=js @ ./src/views/srm/materialcert/MaterialCertDetail.vue?vue&type=script&lang=js @ ./src/views/srm/materialcert/MaterialCertDetail.vue @ ./src/views lazy ^\.\/.*\.vue$ namespace object @ ./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--13-0!./node_modules/_babel-loader@8.4.1@babel-loader/lib!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--1-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options!./src/components/tools/DynamicNotice.vue?vue&type=script&lang=js @ ./src/components/tools/DynamicNotice.vue?vue&type=script&lang=js @ ./src/components/tools/DynamicNotice.vue @ ./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--13-0!./node_modules/_babel-loader@8.4.1@babel-loader/lib!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--1-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options!./src/components/tools/HeaderNotice.vue?vue&type=script&lang=js @ ./src/components/tools/HeaderNotice.vue?vue&type=script&lang=js @ ./src/components/tools/HeaderNotice.vue @ ./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--13-0!./node_modules/_babel-loader@8.4.1@babel-loader/lib!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--1-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options!./src/components/tools/UserMenu.vue?vue&type=script&lang=js @ ./src/components/tools/UserMenu.vue?vue&type=script&lang=js @ ./src/components/tools/UserMenu.vue @ ./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--13-0!./node_modules/_babel-loader@8.4.1@babel-loader/lib!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--1-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options!./src/components/page/GlobalHeader.vue?vue&type=script&lang=js @ ./src/components/page/GlobalHeader.vue?vue&type=script&lang=js @ ./src/components/page/GlobalHeader.vue @ ./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--13-0!./node_modules/_babel-loader@8.4.1@babel-loader/lib!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--1-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options!./src/components/page/GlobalLayout.vue?vue&type=script&lang=js @ ./src/components/page/GlobalLayout.vue?vue&type=script&lang=js @ ./src/components/page/GlobalLayout.vue @ ./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--13-0!./node_modules/_babel-loader@8.4.1@babel-loader/lib!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--1-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options!./src/components/layouts/TabLayout.vue?vue&type=script&lang=js @ ./src/components/layouts/TabLayout.vue?vue&type=script&lang=js @ ./src/components/layouts/TabLayout.vue @ ./src/utils/util.js @ ./src/permission.js @ ./src/main.js @ multi ./node_modules/_webpack-dev-server@3.11.3@webpack-dev-server/client?http://192.168.17.23:3002&sockPath=/sockjs-node (webpack)/hot/dev-server.js ./src/main.js error in ./node_modules/_fast-png@6.4.0@fast-png/lib-esm/PngEncoder.js Module parse failed: Unexpected token (11:8) You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders | }; | export default class PngEncoder extends IOBuffer { > _png; | _zlibOptions; | _colorType; @ ./node_modules/_fast-png@6.4.0@fast-png/lib-esm/index.js 2:0-38 10:24-34 @ ./node_modules/_jspdf@3.0.3@jspdf/dist/jspdf.es.min.js @ ./node_modules/_html2pdf.js@0.12.1@html2pdf.js/dist/html2pdf.js @ ./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--13-0!./node_modules/_babel-loader@8.4.1@babel-loader/lib!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--1-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options!./src/views/srm/materialcert/MaterialCertDetail.vue?vue&type=script&lang=js @ ./src/views/srm/materialcert/MaterialCertDetail.vue?vue&type=script&lang=js @ ./src/views/srm/materialcert/MaterialCertDetail.vue @ ./src/views lazy ^\.\/.*\.vue$ namespace object @ ./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--13-0!./node_modules/_babel-loader@8.4.1@babel-loader/lib!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--1-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options!./src/components/tools/DynamicNotice.vue?vue&type=script&lang=js @ ./src/components/tools/DynamicNotice.vue?vue&type=script&lang=js @ ./src/components/tools/DynamicNotice.vue @ ./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--13-0!./node_modules/_babel-loader@8.4.1@babel-loader/lib!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--1-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options!./src/components/tools/HeaderNotice.vue?vue&type=script&lang=js @ ./src/components/tools/HeaderNotice.vue?vue&type=script&lang=js @ ./src/components/tools/HeaderNotice.vue @ ./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--13-0!./node_modules/_babel-loader@8.4.1@babel-loader/lib!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--1-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options!./src/components/tools/UserMenu.vue?vue&type=script&lang=js @ ./src/components/tools/UserMenu.vue?vue&type=script&lang=js @ ./src/components/tools/UserMenu.vue @ ./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--13-0!./node_modules/_babel-loader@8.4.1@babel-loader/lib!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--1-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options!./src/components/page/GlobalHeader.vue?vue&type=script&lang=js @ ./src/components/page/GlobalHeader.vue?vue&type=script&lang=js @ ./src/components/page/GlobalHeader.vue @ ./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--13-0!./node_modules/_babel-loader@8.4.1@babel-loader/lib!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--1-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options!./src/components/page/GlobalLayout.vue?vue&type=script&lang=js @ ./src/components/page/GlobalLayout.vue?vue&type=script&lang=js @ ./src/components/page/GlobalLayout.vue @ ./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--13-0!./node_modules/_babel-loader@8.4.1@babel-loader/lib!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--1-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options!./src/components/layouts/TabLayout.vue?vue&type=script&lang=js @ ./src/components/layouts/TabLayout.vue?vue&type=script&lang=js @ ./src/components/layouts/TabLayout.vue @ ./src/utils/util.js @ ./src/permission.js @ ./src/main.js @ multi ./node_modules/_webpack-dev-server@3.11.3@webpack-dev-server/client?http://192.168.17.23:3002&sockPath=/sockjs-node (webpack)/hot/dev-server.js ./src/main.js 这个问题怎么解决
最新发布
11-16
<think> 我们遇到了一个Webpack构建错误,提示"Module parse failed: Unexpected token",通常发生在Webpack尝试解析JavaScript文件时遇到了它无法理解的语法(可能是较新的ECMAScript特性)。根据引用内容,我们知道之前解决过类似问题(无法转换ES2016标准),通过使用`terser-webpack-plugin`替换了默认的压缩插件。但当前问题更可能是由于缺少合适的loader来处理文件中的新语法。 用户的问题是关于处理`fast-png`库中的`PngDecoder.js`和`PngEncoder.js`文件时出现的错误。错误信息明确提示需要合适的loader来处理这种文件类型。因此,我们需要配置相应的loader(例如babel-loader)来转换这些文件。 解决方案步骤: 1. 安装必要的依赖:`babel-loader`、`@babel/core`、`@babel/preset-env`。 2.Webpack配置中为这些JavaScript文件添加`babel-loader`,确保将`fast-png`库中的文件包含进去(因为node_modules中的模块默认是排除的,所以我们需要显式包含`fast-png`)。 3. 创建`.babelrc`文件或类似的配置来指定预设(preset)和插件(plugin)。 注意:引用中提到了使用`terser-webpack-plugin`解决压缩问题,但当前问题发生在解析阶段,所以我们需要先解决解析问题,压缩问题可能随后解决。 具体配置如下: 第一步:安装依赖 ```bash npm install -D babel-loader @babel/core @babel/preset-env ``` 第二步:修改Webpack配置(webpack.config.js),添加loader规则 ```javascript module.exports = { // ... 其他配置 module: { rules: [ { test: /\.js$/, // 排除node_modules,但是特别包含fast-png库,因为问题出在这个库上 // 注意:因为fast-png在node_modules中,默认被排除,所以我们需要显式包含它 include: /node_modules\/fast-png/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'] } } } ] }, // 如果之前压缩有问题,可以按照引用中的方式配置terser-webpack-plugin optimization: { minimizer: [ new TerserPlugin({ terserOptions: { // 配置选项,如ecma版本等 ecma: 6, // 根据你的目标环境设置 // 其他terser选项 } }) ] } }; ``` 第三步:创建`.babelrc`文件(可选,如果不在Webpack配置中直接写options) ```json { "presets": ["@babel/preset-env"] } ``` 这样配置后,Webpack在遇到`fast-png`库中的.js文件时就会使用babel-loader进行转换,从而解决语法解析问题。 注意:如果问题仍然存在,可能需要检查fast-png库的具体语法,看看是否需要额外的babel插件。 另外,如果项目中其他文件也需要使用babel转换,那么应该为这些文件也配置babel-loader,但通常我们不会转换整个node_modules(因为大多数库已经转换过),所以这里只针对有问题的`fast-png`库。 引用[^1]中提到的`terser-webpack-plugin`配置,主要是解决压缩阶段的问题。在我们的配置中,也一并加入以处理可能的压缩问题(如果之前存在压缩问题的话)。 如果问题仍然存在,请检查错误信息中具体的语法位置,可能需要针对该语法添加额外的babel插件。 相关问题: 1. 如何配置babel-loader来转换node_modules中的特定模块? 2. Webpackloader的作用是什么? 3. 除了babel-loader,还有哪些常用的JavaScript loader? </think>针对Webpack处理`fast-png`库文件时出现的`Module parse failed: Unexpected token`错误,根本原因是Webpack默认配置无法解析文件中的ECMAScript新语法。以下是系统化的解决方案: ### 解决方案 1. **安装必要依赖** ```bash npm install -D babel-loader @babel/core @babel/preset-env ``` 2. **配置Webpack规则** 在`webpack.config.js`中添加针对`fast-png`的专门解析规则: ```javascript module.exports = { module: { rules: [ { test: /\.js$/, // 关键:显式包含fast-png库 include: /node_modules\/fast-png/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'] } } } ] } }; ``` **配置说明**: - `include: /node_modules\/fast-png/` 显式指定处理目标库 - `@babel/preset-env` 自动识别并转换ES6+语法 3. **添加Babel配置**(可选) 在项目根目录创建`.babelrc`: ```json { "presets": [ ["@babel/preset-env", { "targets": "> 0.25%, not dead" }] ] } ``` ### 错误原理分析 当Webpack遇到`PngDecoder.js`中的ES6+语法时(如箭头函数、`const`等),由于: 1. 默认配置不处理`node_modules`中的JS文件 2. 缺少对新语法的转换能力 导致解析失败。通过`babel-loader`显式包含目标库并转换语法即可解决[^1]。 ### 验证方法 ```bash npx webpack --mode development ``` 观察输出中是否包含以下信息: ``` Built at: 2023-XX-XX XX:XX:XX Asset Size Chunks Chunk Names main.js 1.5 MiB main [emitted] main ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值