您现在的位置是:亿华云 > IT科技类资讯
CommonJS 是如何导致打包后体积增大的?
亿华云2025-10-08 23:12:14【IT科技类资讯】9人已围观
简介原文链接:https://web.dev/commonjs-larger-bundles今天的文章,将介绍什么是 CommonJS,以及它为什么会导致我们打包后的文件体积增大。什么是 CommonJS
原文链接:https://web.dev/commonjs-larger-bundles
今天的何导文章,将介绍什么是致打增 CommonJS,以及它为什么会导致我们打包后的包后文件体积增大。
什么是体积 CommonJS?
CommonJS 是 2009 年发布的 JavaScript模块化的一项标准,最初它只打算在浏览器之外的何导场景使用,主要用于服务器端的致打增应用程序。
你可以使用 CommonJS 来定义模块,包后并从中导出部分模块。体积例如,何导下面的致打增代码定义了一个模块,该模块导出了五个函数:add、包后 subtract、体积 multiply、何导 divide、致打增max:
// utils.js const { maxBy } = require(lodash-es); const fns = { add: (a,包后 b) => a + b, subtract: (a, b) => a - b, multiply: (a, b) => a * b, divide: (a, b) => a / b, max: arr => maxBy(arr) }; Object.keys(fns).forEach(fnName => module.exports[fnName] = fns[fnName]);其他模块可以导入这个模块的部分函数。
// index.js const { add } = require(‘./utils); console.log(add(1, 2));通过 node 运行 index.js ,会在控制台输出数字 3。
在 2010 年,由于浏览器缺乏标准化的模块化能力,CommonJS 成了当时 JavaScript 客户端较为流行的模块化标准。
CommonJS 如何影响包体?
服务端的香港云服务器 JavaScript 程序对代码体积并不像浏览器中那么敏感,这就是为什么在设计 CommonJS 的时候,并没有考虑减少生产包大小的原因。同时,研表究明 JavaScript 代码的体积依然是影响页面加载速度的一个重要因素。
JavaScript 的打包工具(webpack、terser)会进行许多优化以减小最后生成的包体大小。他们在构建时,会分析你的代码,尽可能的删除不会使用的部分。例如,上面的代码中,最终生成的包应该只包含 add 函数,因为这是 index.js 唯一从 utils.js 中导入的部分。
下面我们使用如下 webpack 配置对应用进行打包:
const path = require(path); module.exports = { entry: index.js, output: { filename: out.js, path: path.resolve(__dirname, dist), }, mode: production, };我们需要将 webpack 的 mode 指定为 production,并且将 index.js 作为入口。运行 webpack 后,源码库会输出一个文件:dist/out.js,可以通过如下方式统计它的大小:
$ cd dist && ls -lah 625K Apr 13 13:04 out.js打包后的文件高达 625 KB。如果看下 out.js 文件,会发现 utils.js 导入 lodash 的所有模块都打包到了输出的文件中,尽管我们在 index.js 并没有使用到 lodash 的任何方法,但是这给我们的包体带来了巨大的影响。
现在我们将代码的模块化方案改为 ESM,utils.js 部分的代码如下:
export const add = (a, b) => a + b; export const subtract = (a, b) => a - b; export const multiply = (a, b) => a * b; export const divide = (a, b) => a / b; import { maxBy } from lodash-es; export const max = arr => maxBy(arr);index.js 也改为 ESM 的方式从 utils.js 导入模块:
import { add } from ./utils; console.log(add(1, 2));使用相同的 webpack 配置,构建完毕之后,我们打开 out.js ,仅有 40 字节,输出如下:
(()=>{ "use strict";console.log(1+2)})();值得注意的是,最终的输出并没有包含 utils.js 的任何代码,而且 lodash 也消失了。而且 terser(webpack 使用的压缩工具)直接将 add 函数内联到了 console.log 内部。
有的服务器租用小朋友可能就会问了(此处采用了李永乐语法),为什么使用 CommonJS 会导致输出的文件大了 16,000 倍?当然,这只是用来展示 CommonJS 与 ESM 差异的案例,实际上并不会出现这么大的差异,但是使用 CommonJS 肯定会导致打包后的体积更大。
一般情况下,CommonJS 模块的体积更加难优化,因为它比 ES 模块更加的动态化。为了确保构建工具以及压缩工具能成功优化代码,请避免使用 CommonJS 模块。
当然,如果你只在 utils.js 采用了 ESM 的模块化方案,而 index.js 还是维持 CommonJS,则包体依旧会受到影响。
为什么 CommonJS 会使包体更大?
要回答这个问题,我们需要研究 webpack 的 ModuleConcatenationPlugin 的行为,并且看看它是如何进行静态分析的。该插件将所有的模块都放入一个闭包内,这会让你的代码在浏览器中更快的执行。我们来看看下面的代码:
// utils.js export const add = (a, b) => a + b; export const subtract = (a, b) => a - b; // index.js import { add } from ‘./utils; const subtract = (a, b) => a - b; console.log(add(1, 2));我们有一个新的 ESM 模块(utils.js),将其导入 index.js 中,我们还重新定义一个 subtract 函数。接下来使用之前的 webpack 配置来构建项目,但是这次,我把禁用压缩配置。
const path = require(path); module.exports = { entry: index.js, output: { filename: out.js, path: path.resolve(__dirname, dist), }, + optimization: { + minimize: false + }, mode: production, };输出的 out.js 如下:
/很赞哦!(1171)
上一篇: CNAME:对应解析的记录值为域名地址
下一篇: 为什么起域名意义非凡?起域名有什么名堂?
相关文章
- 为了避免将来给我们的个人站长带来的麻烦,在选择域名后缀时,我们的站长最好省略不稳定的后缀域名,比如n,因为我们不知道策略什么时候会改变,更不用说我们将来是否还能控制这个域名了。因此,如果站长不是企业,或者有选择的话,如果不能选择域名的cn类,最好不要选择它。
- cm域名有什么独特之处?新人要了解cm域名哪些?
- 在众多公司中,如果我们必须选择一家可信的公司,那当然是信得过的。
- 评估域名涉及的行业规模与发展状况成正比。
- 4、企业无形资产:通用网站已成为企业网络知识产权的重要组成部分,属于企业的无形资产,也有助于提升企业的品牌形象和技术领先形象。它是企业品牌资产不可或缺的一部分。
- 最后提醒我们,域名到期后要及时更新域名,否则可能会丢掉域名,每次抢先注册都不会成功。
- 以上的就是为大家介绍的关于域名的详解域名注册:域名注册0
- 公司和个人选域名方法一样吗?有什么不同?
- 为什么起域名意义非凡?起域名有什么名堂?
- 为什么喜欢国外注册域名?国外注册域名注意什么?
热门文章
站长推荐
4、域名传输时,取决于域名原始用户的邮箱是否有效,以及他是否将密码发送到此邮箱。
当投资者经过第二阶段的认真学习之后又充满了信心,认为自己可以在市场上叱咤风云地大干一场了。但没想到“看花容易绣花难”,由于对理论知识不会灵活运用.从而失去灵活应变的本能,就经常会出现小赢大亏的局面,结果往往仍以失败告终。这使投资者很是困惑和痛苦,不知该如何办,甚至开始怀疑这个市场是不是不适合自己。在这种情况下,有的人选择了放弃,但有的意志坚定者则决定做最后的尝试。
小白注册网站域名该怎么办?有什么步骤?
打开https://www.aizhan.com/输入自己想要查询的域名然后按回车键,如果做过网站都会有数据显示出来
新手可以注册cc域名吗?cc域名有什么特点?
在众多公司中,如果我们必须选择一家可信的公司,那当然是信得过的。
.com域名是国际最广泛流行的通用域名,目前全球注册量第一的域名,公司企业注册域名的首选。国际化公司通常会注册该类域名。
顶级域名可以增加企业品牌的价值。随着经济的快速发展,域名已不再是企业在网络中的独立地位。顶级域名的服务范围、企业产品、综合形象体现等,对于企业单位来说,顶级域名的重要性不言而喻。