浅谈Webpack 是如何加载模块的

Webpack 在前端开发中作为模块打包工具非常受开发者的青睐,丰富的 loader 使它可以实现各种各样的功能。本文将通过 webpack 来打包一个 js 文件,看看 webpack 是如何加载各个模块的。

两个简单的源文件

为了方便分析 webpack 加载模块的原理,我们准备了两个文件:

hello.js


1
2
3
4
5
6
7
const hello = {
say: arg => {
console.info( 'hello ' + arg || 'world' );
}
};
export default hello;

index.js


1
2
3
import Hello from './hello' ;
Hello.say( 'man' );

index.js 作为入口文件,引用了 hello.js 模块。

Webpack 打包

在命令行执行 webpack index.js bundle.js 对入口文件进行打包,生成 bundle.js ,大体结构为(为了方便阅读,我删除了部分多余的代码):

可以看到,最终生成的文件以 (function (modules) {})([模块1, 模块2]) 的方式启动,我们定义的模块被包装成一个个匿名函数,然后以数组的形式传递个一个匿名函数 function (modules) {},在这个匿名函数中定义了一个 __webpack_require__() 函数,用来加载模块,最后,通过 return __webpack_require__(__webpack_require__.s = 0); 来加载第一个模块 index.js

__webpack_require__() 函数

该函数接收一个 moduleId 作为参数,这个参数就是各个模块在数组中的索引,


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/
if (installedModules[moduleId]) {
/******/
return installedModules[moduleId].exports;
/******/
}
/******/ // Create a new module (and put it into the cache)
/******/
var module = installedModules[moduleId] = {
/******/
i: moduleId,
/******/
l: false ,
/******/
exports: {}
/******/
};
/******/
/******/ // Execute the module function
/******/
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/
module.l = true ;
/******/
/******/ // Return the exports of the module
/******/
return module.exports;
/******/
}

其中 installedModules 是用来缓存执行过的模块。通过 modules[moduleId].call() 来执行模块,最后返回模块的 exports。

模块接受的参数

以 hello.js 模块为例


1
2
3
4
5
6
7
8
9
10
11
12
13
14
( function (module, __webpack_exports__, __webpack_require__) {
"use strict" ;
const hello = {
say: arg => {
console.info( 'hello ' + arg || 'world' );
}
};
/* harmony default export */
__webpack_exports__[ "a" ] = (hello);
/***/
})

webpack 会向模块传递 module, __webpack_exports__, __webpack_require__ 三个参数,前两个是用来导出模块内的变量,第三个参数为前面介绍的 __webpack_require__() 的引用,用来导入其它模块。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Webpack加载是一种优化前端性能的技术,可以减少初始加载文件的大小,从而提高页面加载速度。通常,当页面加载时,所有的JS代码都会被一次性加载并执行。但是,如果我们将某些模块延迟加载,只有在需要时才加载,那么就可以减少初始加载的文件大小。 Webpack提供了一个import()方法,用于动态地加载模块,它会返回一个Promise对象,可以在resolve时获取到模块的导出对象。使用这个方法,我们可以将模块加载延迟到需要使用的时候再加载,这就是Webpack加载的原理。 以下是一个使用Webpack加载的示例: ``` import('./module').then(module => { // 使用模块 }); ``` 在上面的示例中,当代码执行到import()时,会异步地加载'module'模块加载完成后,会执行then()中的回调函数,我们可以在回调函数中使用模块。 注意:使用Webpack加载时,需要确保代码可以被正确地拆分成多个文件,否则可能会导致页面加载错误。 ### 回答2: webpack加载是一种通过代码分割实现按需加载模块的技术。当使用webpack构建项目时,所有的模块将被打包到一个文件中,然后在浏览器中加载。这意味着无论使用者需要哪些模块,都会一次性加载,这可能会导致初始加载时间过长。 懒加载通过将应用程序拆分为不同的模块,使得每个页面仅加载当前页面所需的模块,而不是加载整个应用程序。当用户访问某个页面时,只有该页面所需要的模块会被加载,其他模块则会等到需要时再进行加载。这样就能减少初始加载时间,提高页面的响应速度。 实现懒加载的方式有多种。一种常见的方式是使用import()函数动态导入模块。import()函数会返回一个Promise对象,当该模块加载后,Promise会被resolve。可以通过调用then()方法来执行加载完成后的回调函数。 另一种方式是使用React中的Suspense组件来包裹异步加载的组件。Suspense组件可以渲染一个在组件加载完成之前显示的loading界面,等到异步组件加载完成后再进行渲染。 懒加载不仅可以减少初始加载时间,还可以按需加载不同的模块,提高应用的性能和效率。然而,懒加载也有一些注意事项。需要确保按需加载模块之间的依赖关系正确,并且避免产生额外的网络请求。要注意合理使用懒加载,避免过度拆分导致加载过多的小模块,从而影响性能。 总结来说,webpack加载是一种通过代码分割实现按需加载模块的技术,可以提高应用的加载速度和性能。通过合理使用懒加载的方式,可以有效减少初始加载时间,提高用户体验。 ### 回答3: Webpack加载是指将某个模块作为一个单独的文件进行加载,而不是和其他模块一起打包到同一个初始模块中。这样可以在需要时才加载模块,而不是在初始加载时就加载所有模块。 懒加载的主要优势在于减少初始加载时的文件大小和加载时间。当网页打开时,只需要加载初始模块,而其他模块则在实际需要时再进行加载。这样可以提升网页的加载速度和用户体验,特别是对于大型应用程序。 在Webpack中实现懒加载可以通过使用import函数的动态导入语法来实现。例如,在需要懒加载的地方使用类似于import('module')的语法来导入模块Webpack会将该模块打包为一个单独的文件,并在需要时进行异步加载。 需要注意的是,懒加载需要配合Webpack的代码分离功能来使用。通过配置Webpack的optimization.splitChunks参数,可以将重复引用的模块提取出来,生成共享的模块文件。这样可以避免在懒加载时重复加载已经存在的模块。 除了使用动态导入语法外,Webpack还提供了其他的技术来实现懒加载,如按需加载的require.ensure语法和React.lazy()方法。这些方法都可以实现类似的懒加载效果。 总之,Webpack加载是一种优化网页加载性能的重要技术。它通过将复杂的应用程序划分为多个模块文件,在需要时再进行加载,从而减少初始加载时间和文件大小,提升用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值