首页 > 其他分享 >webpack5提升打包构建速度(四)

webpack5提升打包构建速度(四)

时间:2024-11-28 10:33:07浏览次数:10  
标签:__ node webpack5 modules js 构建 css loader 打包

1、SourceMap:找到映射后源代码出错位置

SourceMap(源代码映射)是一个用来生成源代码与构建后代码一一映射的文件的方案。

它会生成一个 xxx.map 文件,里面包含源代码和构建后代码每一行、每一列的映射关系。当构建后代码出错了,会通过 xxx.map 文件,从构建后代码出错位置找到映射后源代码出错位置,从而让浏览器提示源代码文件出错位置,帮助我们更快的找到错误根源。

/* 
 * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
 * This devtool is neither made for production nor for readable output files.
 * It uses "eval()" calls to create a separate source file in the browser devtools.
 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
 * or disable the default devtool with "devtool: false".
 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
 */
/******/ (() => { // webpackBootstrap
/******/    "use strict";
/******/    var __webpack_modules__ = ({

/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/less-loader/dist/cjs.js!./src/less/index.less":
/*!**********************************************************************************************************!*\
  !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/less-loader/dist/cjs.js!./src/less/index.less ***!
  \**********************************************************************************************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {

eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".box2 {\\n  width: 100px;\\n  height: 100px;\\n  background-color: deeppink;\\n}\\n\", \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://webpack5/./src/less/index.less?./node_modules/css-loader/dist/cjs.js!./node_modules/less-loader/dist/cjs.js");

/***/ }),
// 其他省略

打包完代码出错完全找不到哪里出错了,如果在配置文件中配置好属性,就能方便的找到打包后出错的代码所在行。

如何配置?

开发模式下配置:cheap-module-source-map
优点:打包编译速度快,只包含行映射
缺点:没有列映射

module.exports = {
  // 其他省略
  mode: "development",
  devtool: "cheap-module-source-map",
};

生产模式:source-map
优点:包含行/列映射
缺点:打包编译速度更慢

module.exports = {
  // 其他省略
  mode: "production",
  devtool: "source-map",
};
2、HMR/模块热替换(HotModuleReplacement):在程序运行中,替换、添加或删除模块,而无需重新加载整个页面。

如何配置?
在devServer中配置hot:true

module.exports = {
  // 其他省略
  devServer: {
    host: "localhost", // 启动服务器域名
    port: "3000", // 启动服务器端口号
    open: true, // 是否自动打开浏览器
    hot: true, // 开启HMR功能(只能用于开发环境,生产环境不需要了)
  },
};

经过上面的设置, css 样式经过 style-loader 处理,已经具备 HMR 功能了。但是 js 还不行。js要经过下面的设置方式:

import count from './js/count'
import sum from './js/sum'
import './css/index.css'
import './css/index.less'
import './css/index.sass'

const result = count(8, 2)
console.log(result, 'result')
console.log(count(8, 2))
console.log(sum(2, 3))

// 判断是否支持HMR功能  这样设置是指这两个js文件更新时,局部刷新内容
if (module.hot) {
    module.hot.accept("./js/count.js", function(count) {
        const result1 = count(2, 1);
        console.log(result1);
    });

    module.hot.accept("./js/sum.js", function(sum) {
        const result2 = sum(5, 6);
        console.log(result2);
    });
}

上面的写法还是比较麻烦的,之后我们还是会用到loader去处理:vue-loader, react-hot-loader

3、OneOf:匹配上一个 loader, 剩下的就不忽略了。

如何配置?
在module中rules的loader用oneOf全部都包起来。生产模式也是这样配置。

 module: {
        rules: [{
            oneOf: [{
                    // 用来匹配 .css 结尾的文件
                    test: /\.css$/,
                    // use 数组里面 Loader 执行顺序是从右到左
                    use: ["style-loader", "css-loader"],
                },
                {
                    test: /\.less$/,
                    use: ["style-loader", "css-loader", "less-loader"],
                },
                {
                    test: /\.sass$/,
                    use: ["style-loader", "css-loader", "sass-loader"],
                },
                {
                    test: /\.(png|jpe?g|gif|webp)$/,
                    type: "asset",
                    parser: {
                        dataUrlCondition: {
                            maxSize: 10 * 1024 // 小于10kb的图片会被base64处理
                        }
                    },
                    //设置图片打包后的路径
                    generator: {
                        filename: 'dist/images/[hash:10][ext][query]'
                    }
                },
            ]
        }],
    },
4、Include/Exclude:在对 js 文件处理时,要排除 node_modules 下面的文件。

include:包含,只处理 xxx 文件
exclude:排除,除了 xxx 文件以外其他文件都处理

如何设置

例如 module中这样设置:

{
       test: /\.js$/,
       // exclude: /node_modules/, // 排除node_modules代码不编译
       include: path.resolve(__dirname, "../src"), // 也可以用包含
       loader: "babel-loader",
},

插件中也可以这样设置:

 plugins: [
    new ESLintWebpackPlugin({
      // 指定检查文件的根目录
      context: path.resolve(__dirname, "../src"),
      exclude: "node_modules", // 默认值
    }),
]
5、多进程打包:开启电脑的多个进程同时干一件事,速度更快

需要注意:请仅在特别耗时的操作中使用,因为每个进程启动就有大约为 600ms 左右开销。

如何设置
我们启动进程的数量就是我们 CPU 的核数。

  1. 如何获取 CPU 的核数,因为每个电脑都不一样。
// nodejs核心模块,直接使用
const os = require("os");
// cpu核数
const threads = os.cpus().length;
  1. 下载包
npm i thread-loader -D

3.使用
在module的rules中的引入babel-loader的use中添加如下代码

{
    loader: "thread-loader", // 开启多进程
     options: {
          workers: threads, // 数量
      },
 },

在plugins的new ESLintWebpackPlugin中配置 threads, // 开启多进程
最后在optimization中new TerserPlugin中配置如下设置:

  optimization: {
    minimize: true,
    minimizer: [
      // css压缩也可以写到optimization.minimizer里面,效果一样的
      new CssMinimizerPlugin(),
      // 当生产模式会默认开启TerserPlugin,但是我们需要进行其他配置,就要重新写了
      new TerserPlugin({
        parallel: threads // 开启多进程
      })
    ],
  },

所以总的module代码配置如下:

module.exports = {
    //入口文件
    entry: {
        index: './src/main.js',
        admin: './src/main2.js',
    },
    //出口文件
    output: {
        path: undefined, // 开发模式没有输出,不需要指定输出目录
        filename: "static/js/[name]main.js", // 将 js 文件输出到 static/js 目录中
        clean: true, // 开发模式没有输出,不需要清空输出结果
    },
    module: {
        rules: [{
            oneOf: [{
                    // 用来匹配 .css 结尾的文件
                    test: /\.css$/,
                    // use 数组里面 Loader 执行顺序是从右到左
                    use: ["style-loader", "css-loader"],
                },
                {
                    test: /\.less$/,
                    use: ["style-loader", "css-loader", "less-loader"],
                },
                {
                    test: /\.sass$/,
                    use: ["style-loader", "css-loader", "sass-loader"],
                },
                {
                    test: /\.(png|jpe?g|gif|webp)$/,
                    type: "asset",
                    parser: {
                        dataUrlCondition: {
                            maxSize: 10 * 1024 // 小于10kb的图片会被base64处理
                        }
                    },
                    //设置图片打包后的路径
                    generator: {
                        filename: 'dist/images/[hash:10][ext][query]'
                    }
                },
                {
                    test: /\.js$/,
                    // exclude: /node_modules/, // 排除node_modules代码不编译
                    include: path.resolve(__dirname, "../src"), // 也可以用包含
                    use: [{
                            loader: "thread-loader", // 开启多进程
                            options: {
                                workers: threads, // 数量
                            },
                        },
                        {
                            loader: "babel-loader",
                            options: {
                                cacheDirectory: true, // 开启babel编译缓存
                            },
                        },
                    ],
                },
            ]
        }],
    },
    plugins: [
        new ESLintWebpackPlugin({
            // 指定检查文件的根目录
            context: path.resolve(__dirname, "src"),
            exclude: "node_modules", // 默认值
            cache: true, // 开启缓存
            // 缓存目录
            cacheLocation: path.resolve(
                __dirname,
                "../node_modules/.cache/.eslintcache"
            ),
            threads, // 开启多进程
        }),
    ],
    optimization: {
        minimize: true,
        minimizer: [
            // css压缩也可以写到optimization.minimizer里面,效果一样的
            new CssMinimizerPlugin(),
            // 当生产模式会默认开启TerserPlugin,但是我们需要进行其他配置,就要重新写了
            new TerserPlugin({
                parallel: threads // 开启多进程
            })
        ],
    },

    //模式
    mode: "production",
    devtool: "source-map",
}

这个时候再打包试试看,其实目前文件比较小的话,实际打包的速度比之前是慢的,只有文件的内容足够大时,处在一个临界值的时候,才发现用这个方法打包速度大大提高!

标签:__,node,webpack5,modules,js,构建,css,loader,打包
From: https://blog.csdn.net/wuhhongjing88/article/details/144104564

相关文章

  • Vue-无构建工具的创建、挂载、渲染
    简介Vue是一个动态构建用户界面的渐进式JS框架.借鉴了Angular的模板语法和数据绑定借鉴了React的组件化和虚拟DOM特点:声明式渲染:先声明后使用响应式数据:数据改变时,视图会响应数据的改变,重新渲染新的值组件化开发安装项目初始化:npminit-y安装vue:npm......
  • 构建之法
    第一章概论软件工程是什么?软件工程的核心部分(构建管理、源代码管理、软件设计、软件测试、项目管理)和用户体验、用户界面设计等组成了软件工程,而软件=程序+软件工程。软件开发过程中的难题有5点:1、复杂性2、不可见性3、易变性4、服从性5、非连续性软件的其他特性......
  • webpack5新特性
    1.webpack5的解构代码打包方式针对下面文件进行打包.//moduleAexportdefault{a:1,}//index.jsimportmoduleAfrom"./moduleA";console.log("hellowebpack",moduleA);webpack5的打包结果,就这28行.但是webpack4有300多行.300多行里很多是引入函数impo......
  • 项目打包构建优化
    项目打包构建优化优化项目:vue3-elm-master方法查找并诊断性能瓶颈构建速度分析:影响构建性能和开发效率.speed-measure-webpack-plugin构建体积分析:影响页面访问性能webpack-bundle-analyzer构建性能优化常用方法:通过多进程加快构建速度thread-loader通过......
  • 高校宿舍节能用电现状及智慧监管平台构建
    0引言在节能减排的大背景下,高校通过精细化宿舍用电管理,提升师生的节能节电意识等举措,能够显著提高电能资源的使用效率,并有效预防火灾等安全事故,确保师生的人身安全。因此,当前亟需加强对智慧监管平台的研究与应用,确保节能节电措施得到严格执行,以推动高校的可持续发展。1高......
  • 构建与计算:使用递归实现表达式的二叉树解析器
    ✅作者简介:2022年博客新星第八。热爱国学的Java后端开发者,修心和技术同步精进。......
  • 【Unity 插件】MiniMonsters - Turn Based Monster Battles快速构建回合制怪物对战游
    MiniMonsters-TurnBasedMonsterBattles是一款专为Unity开发者设计的插件,旨在帮助开发者快速构建回合制怪物对战游戏。该插件提供了一整套完整的系统,包括怪物战斗逻辑、技能系统、回合制战斗管理等功能,使得开发者能够专注于游戏内容的创作,而不需要从零开始编写复杂的战......
  • Linux下打包Qt应用程序
    linux下打包应用程序非常复杂接下来一步一步实现第一步:下载linuxdeployqt程序我已经保存在了百度网盘,记住qt5用老一些的版本第二步:下载好后重命名为linuxdeployqt好用一点然后将其移动到/usr/local/bin目录下并且授权记住一定要授权检查是否成功sudolinuxdeployq......
  • 使用 Django 构建支持 Kubernetes API 测试连接的 POST 接口
    文章目录使用Django构建支持KubernetesAPI测试连接的POST接口功能需求使用kubectl获取Token命令解析输出示例完整代码实现KubernetesAPI客户端类功能说明Django接口视图关键点解析路由配置接口测试请求示例响应结果成功错误优化建议1.安全性2.错误......
  • 从头开始构建一个大型语言模型《Build a Large Language Model (From Scratch)》附PDF
    通过从头开始构建一个大型语言模型,了解如何创建、训练和调整大型语言模型(LLMs)!一、构建大型语言模型(从头开始)在《构建大型语言模型(从头开始)》中,你将了解如何LLMs从内到外工作。在这本富有洞察力的书中,畅销书作家塞巴斯蒂安·拉施卡(SebastianRaschka)将指导你逐步创建......