在现代的前端开发中,使用诸如 Node.js 和 npm 等工具来管理依赖已经成为了常态。当我们使用 webpack 进行打包构建时,webpack 会默认扫描项目中的 node_modules 文件夹并将其作为依赖项进行处理。然而,node_modules 文件夹下的文件数量庞大且复杂,它们在 webpack 中的处理方式可能会带来一些问题,本文将深入探讨如何处理这些文件。
自动加载模块
在 webpack 中,我们可以直接 import
或 require
引用模块,例如:
import _ from 'lodash'; const _ = require('lodash');
这样做的好处是方便,但坏处是它会导致所有引用的模块被打包构建到最终的输出文件中,这造成了所有 node_modules 的代码都被放进了 bundle,最终使得 bundle 变得非常大。
解决这个问题的方法是使用 externals
选项来告诉 webpack 那些模块应该作为外部依赖。我们可以在配置文件中这样设置:
module.exports = { //... externals: { // 不打包 lodash 模块,而是使用全局的 _. 链接 lodash: '_' } }
这样,webpack 就会将 lodash 模块剔除出 bundle 并用全局的 _
变量替换它的引用。
排除文件的处理
有时候,我们并不需要对所有的 node_modules 下的代码进行打包构建。例如,当我们使用某个特定的库时,它可能会被内联到页面中,所以我们不需要对它进行打包。又或者,我们并不想处理第三方模块的样式文件,因为它们已经被打包成 CSS 文件了。
针对这些情况,webpack 设计了 exclude
和 include
选项来控制文件的处理范围。例如,我们可以这样配置:
-- -------------------- ---- ------- -------------- - - ----- ------- - ------ -- ----- -------------- -------- ---------------------------------- ---- - ------- -------------- - -- - -
这里我们的意图是排除 node_modules 和 bower_components 中的所有文件,这些文件不会被 babel-loader
处理。通过这样的配置,我们可以得到更加精简的构建文件,减少打包的时间和文件大小。
结论
在本文中,我们深入探讨了 webpack 处理 node_modules 文件夹中代码的一些技巧和方法。通过使用这些方法,我们可以在打包和构建时更加灵活地处理各种场景下的依赖、插件和库。如果你正在使用 webpack,这些方法绝对值得一试。
示例代码
下面是一个完整的 webpack 配置文件,其中包括了我们前文提到的一些示例代码:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ---- - ---------------- -------------- - - ------ ----------------- ------- - ----- ----------------------- -------- --------- ----------- -- ------- - ------ -- ----- -------- -------- ---------------------------------- ---- - ------- -------------- - -- - ----- --------- ---- - --------------- ------------ - -- -- ---------- - -- --- ------ ---------- -- -- ------- --- -- -------- - --- --------------------------------- - --
本配置文件做的事情是:
- 将 entry.js 打包进 dist/bundle.js 中
- 使用 babel-loader 编译 js 文件,但是不包括 node_modules 和 bower_components 下的文件
- 使用 style-loader 和 css-loader 处理 css 文件
- 将 lodash 模块排除出打包
- 使用 UglifyJS 插件优化代码
压缩后的输出文件是以这样的方式使用的:
-- -------------------- ---- ------- --------- ----- ------ ------ --- ------- ------ ------- -------------------------------------------------------------------- ------- ------------------------- ------- -------
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/671dd0199babaf620fb84646