在上一篇文章中,我们介绍了 Webpack 的基本概念和用途以及它的核心概念——entry。本文将会介绍另一个非常重要的核心概念——module,它也是 Webpack 最重要的功能之一。
1. 什么是 module
在 Webpack 的世界中,将所有资源看作是模块(module),包括 JavaScript、CSS、图片等。每个模块都有自己的依赖关系,这些依赖关系通过 import 关键字引入。
Module 可以看作是一个代码段,通过模块的方式导出变量、方法、类等资源。模块可以通过导入(即引入)其他的模块,实现模块之间的交互。
在 JavaScript 中,模块通常使用 CommonJS 或 ES6 的模块语法进行定义。在 Webpack 中,它们都被认为是有效的模块定义方式。
//CommonJS 模块定义 let moduleA = require('./moduleA') //ES6 模块定义 import moduleB from './moduleB'
2. module 的解析规则
Webpack 的 module 解析规则是将所有本地(Local)的文件路径解析成完整的文件路径,在进行具体的文件查找。这意味着,如果你想要使用自定义的约定或者 URI 等方式来导入模块,Webpack 提供了一组规则来自定义 module 解析流程。
通过配置 resolve.alias 可以指定别名,将长长的路径替换成短名称。
//我们引入 $ 符号,代表着 '../../../' 的路径 import $ from '@/components'
resolve.modules 配置可以指定 Webpack 去哪个目录下寻找 third-party 模块,默认只会去 node_modules 下寻找。
//寻找模块的先后顺序为:src -> node_modules resolve: { modules: ['src', 'node_modules'] }
3. module 的打包机制
Webpack 的打包机制是将所有的模块打包到一个 JavaScript 文件中。每个模块被分配一个唯一的 ID,这个 ID 作为模块的索引,使用后者的模块可以通过索引获取其余模块。
Webpack 支持各种模块类型的导出,包括 CommonJS 和 ES6 的模块系统,还支持 AMD、SystemJS、CSS、图片等模块的导入。
例如,我们可以通过下面的方式将模块从文件系统加载到内存中,并用数字 ID 标识这个模块:
Module: { rules: [{test: /\.js$/, use: 'babel-loader'}] }
4. module 的优化
Webpack 模块体系的优点在于可以根据文件系统或者随时符合代码需要动态加载模块。但是,对于庞大的代码库来说,每一个导入都是一个代价。
Webpack 提供了许多可以优化这个流程的方式,包括多个 JavaScript 包的拆分,使用动态导入、缓存等方法。在一些大型应用场景下,通过优化 module 可以提升应用程序的性能和加载速度。
5. 总结
本文介绍了 Webpack 中最重要的核心概念——module。我们了解了 module 是如何定义和解析的,以及如何优化 module 来提高应用程序的性能和速度。基本上,学会了 entry 和 module 这两个概念,就可以为打包应用程序做好充分的准备。
希望本文对您有所帮助,谢谢阅读!
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64731285968c7c53b0097847