We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
虽然在前面的章节中你学会了如何使用 Webpack ,也大致知道其工作原理,可是你想过 Webpack 输出的 bundle.js 是什么样子的吗? 为什么原来一个个的模块文件被合并成了一个单独的文件?为什么 bundle.js 能直接运行在浏览器中? 本节将解释清楚以上问题。
bundle.js
先来看看由 安装与使用 中最简单的项目构建出的 bundle.js 文件内容,代码如下:
See the Pen bundle.js by whjin (@whjin) on CodePen.
以上看上去复杂的代码其实是一个立即执行函数,可以简写为如下:
(function(modules) { // 模拟 require 语句 function __webpack_require__() { } // 执行存放所有模块数组中的第0个模块 __webpack_require__(0); })([/*存放所有模块的数组*/])
bundle.js 能直接运行在浏览器中的原因在于输出的文件中通过 __webpack_require__ 函数定义了一个可以在浏览器中执行的加载函数来模拟 Node.js 中的 require 语句。
__webpack_require__
require
原来一个个独立的模块文件被合并到了一个单独的 bundle.js 的原因在于浏览器不能像 Node.js 那样快速地去本地加载一个个模块文件,而必须通过网络请求去加载还未得到的文件。 如果模块数量很多,加载时间会很长,因此把所有模块都存放在了数组中,执行一次网络加载。
如果仔细分析 __webpack_require__ 函数的实现,你还有发现 Webpack 做了缓存优化: 执行加载过的模块不会再执行第二次,执行结果会缓存在内存中,当某个模块第二次被访问时会直接去内存中读取被缓存的返回值。
例如把源码中的 main.js 修改为如下:
main.js
// 异步加载 show.js import('./show').then((show) => { // 执行 show 函数 show('Webpack'); });
重新构建后会输出两个文件,分别是执行入口文件 bundle.js 和 异步加载文件 0.bundle.js。
0.bundle.js
其中 0.bundle.js 内容如下:
// 加载在本文件(0.bundle.js)中包含的模块 webpackJsonp( // 在其它文件中存放着的模块的 ID [0], // 本文件所包含的模块 [ // show.js 所对应的模块 (function (module, exports) { function show(content) { window.document.getElementById('app').innerText = 'Hello,' + content; } module.exports = show; }) ] );
bundle.js 内容如下:
这里的 bundle.js 和上面所讲的 bundle.js 非常相似,区别在于:
__webpack_require__.e
webpackJsonp
在使用了 CommonsChunkPlugin 去提取公共代码时输出的文件和使用了异步加载时输出的文件是一样的,都会有 __webpack_require__.e 和 webpackJsonp。 原因在于提取公共代码和异步加载本质上都是代码分割。
CommonsChunkPlugin
The text was updated successfully, but these errors were encountered:
No branches or pull requests
输出文件分析
虽然在前面的章节中你学会了如何使用 Webpack ,也大致知道其工作原理,可是你想过 Webpack 输出的
bundle.js
是什么样子的吗? 为什么原来一个个的模块文件被合并成了一个单独的文件?为什么bundle.js
能直接运行在浏览器中? 本节将解释清楚以上问题。先来看看由 安装与使用 中最简单的项目构建出的
bundle.js
文件内容,代码如下:See the Pen bundle.js by whjin (@whjin) on CodePen.
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>以上看上去复杂的代码其实是一个立即执行函数,可以简写为如下:
bundle.js
能直接运行在浏览器中的原因在于输出的文件中通过__webpack_require__
函数定义了一个可以在浏览器中执行的加载函数来模拟 Node.js 中的require
语句。原来一个个独立的模块文件被合并到了一个单独的
bundle.js
的原因在于浏览器不能像 Node.js 那样快速地去本地加载一个个模块文件,而必须通过网络请求去加载还未得到的文件。 如果模块数量很多,加载时间会很长,因此把所有模块都存放在了数组中,执行一次网络加载。如果仔细分析
__webpack_require__
函数的实现,你还有发现 Webpack 做了缓存优化: 执行加载过的模块不会再执行第二次,执行结果会缓存在内存中,当某个模块第二次被访问时会直接去内存中读取被缓存的返回值。分割代码时的输出
例如把源码中的
main.js
修改为如下:重新构建后会输出两个文件,分别是执行入口文件
bundle.js
和 异步加载文件0.bundle.js
。其中
0.bundle.js
内容如下:bundle.js
内容如下:See the Pen bundle.js by whjin (@whjin) on CodePen.
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>这里的
bundle.js
和上面所讲的bundle.js
非常相似,区别在于:__webpack_require__.e
用于加载被分割出去的,需要异步加载的 Chunk 对应的文件;webpackJsonp
函数用于从异步加载的文件中安装模块。在使用了
CommonsChunkPlugin
去提取公共代码时输出的文件和使用了异步加载时输出的文件是一样的,都会有__webpack_require__.e
和webpackJsonp
。 原因在于提取公共代码和异步加载本质上都是代码分割。The text was updated successfully, but these errors were encountered: