原创翻译,转载请注明出处。
原文地址:https://webpack.js.org/guides/code-splitting-require/
在这一章里,我们将讨论webpack怎样使用require.ensure来分割代码。
require.ensure()
编译的时候,webpack对代码里的require.ensure()进行静态解析。任何一个作为一个依赖被引用,或者在回调函数里要求的模块,将会被添加到一个新的代码块里。这个代码块被写到异步包里,webpack通过jsonp按需调用它。
语法:
require.ensure(dependencies: String[], callback:function(require), chunkName: String)
依赖
这是一个字符串数组,在这里我们声明所有模块,确保它们在回调函数里所有的代码都能被执行之前都可用。
回调
一旦依赖被加载完,webpack就会执行回调函数。require函数的一个动作就是向这个函数里传递一个参数。方法体可以使用这个参数给require()模块提供执行需要的东西。
代码块名
由这个require.ensure()生成的代码块的名字。通过给各个require.ensure()调用传递相同的代码块名,我们可以把这些代码结合到一个代码块里,这样的话就只有一个包是浏览器必须加载的。
例子
让我们考虑一下下面的文件构成:
. ├── dist ├── js │ ├── a.js │ ├── b.js │ ├── c.js │ └── entry.js └── webpack.config.js
entry.js
require('./a'); require.ensure(['./b'],function(require){ require('./c'); console.log('done!'); });
a.js
console.log('***** I AM a *****');
b.js
console.log('***** I AM b *****');
c.js
console.log('***** I AM c *****');
webpack.config.js
var path =require('path'); module.exports =function(env){ return{ entry:'./js/entry.js', output:{ filename:'bundle.js', path: path.resolve(__dirname,'dist'), publicPath:'https://cdn.example.com/assets/', // tell webpack where to load the on-demand bundles. pathinfo:true, // show comments in bundles, just to beautify the output of this example. // should not be used for production. } } }
在这个项目上运行webpack,我们会发现webpack生成了两个包,bundle.js和0.bundle.js
entry.js和a.js被打包到bundle.js里
bundle.js
/******/(function(modules){// webpackBootstrap //webpack bootstrap code... /******/ // __webpack_public_path__ /******/ __webpack_require__.p ="https://cdn.example.com/assets/"; // webpack bootstrap code... /******/}) /******/([ /* 0 */ /* unknown exports provided */ /* all exports used */ /*!*****************!*\ !*** ./js/a.js ***! \*****************/ /***/(function(module, exports){ console.log('***** I AM a *****'); /***/}), /* 1 */, /* 2 */, /* 3 */ /* unknown exports provided */ /* all exports used */ /*!*********************!*\ !*** ./js/entry.js ***! \*********************/ /***/(function(module, exports, __webpack_require__){ __webpack_require__(/*! ./a */0); __webpack_require__.e/* require.ensure */(0).then((function(require){ __webpack_require__(/*! ./c */2); console.log('done!'); }).bind(null, __webpack_require__)).catch(__webpack_require__.oe); /***/}) /******/]);
b.js和c.js被打包到0.bundle.js里
0.bundle.js
webpackJsonp([0],[ /* 0 */, /* 1 */ /* unknown exports provided */ /* all exports used */ /*!*****************!*\ !*** ./js/b.js ***! \*****************/ /***/(function(module, exports){ console.log('***** I AM b *****'); /***/}), /* 2 */ /* unknown exports provided */ /* all exports used */ /*!*****************!*\ !*** ./js/c.js ***! \*****************/ /***/(function(module, exports){ console.log('***** I AM c *****'); /***/}) ]);
现在只需将bundle.js加到HTML文件里并在浏览器里打开,0.bundle.js将在需要的时候由webpack加载。
更多地例子:
- https://github.com/webpack/webpack/tree/master/examples/code-splitting
- https://github.com/webpack/webpack/tree/master/examples/named-chunks --代码块名的例子
许诺polyfill
参照7.代码分割 – 使用import()的许诺polyfill。
require.ensure()的一些可伸缩特性
空数组作为参数
require.ensure([],function(require){ require('./a.js'); });
依赖作为参数
require.ensure(['./b.js'],function(require){ require('./c.js'); });
在上面的例子里,b.js和c.js被打包到一起,并且和应用程序包分开。但是只有c.js的内容被执行了。b.js的内容只是被提供了,没有被执行。要想执行b.js,我们需要对要执行的JavaScript代码使用同步的方式像require(‘./b.js’)。
-- End --
相关推荐
Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。它在开发过程中将各种资源(如 JavaScript、CSS、图片等)视为模块,并根据依赖关系进行编译和打包。`webpack-dev-server` 是 Webpack 提供的一个本地...
Webpack 是一个现代JavaScript应用程序的静态模块打包工具。它在开发过程中扮演着重要角色,通过将各种资源(如JavaScript、CSS、图片等)打包成优化过的单一文件,来提高应用的加载速度和性能。Webpack-dev-server ...
5. **热更新(Hot Module Replacement, HMR)**:`webpack-dev-middleware` 可以与 `webpack-hot-middleware` 配合使用,实现实时热更新,无需刷新页面即可看到代码更改的效果。只需在配置文件中开启 HMR,并引入 `...
资源分类:Python库 所属语言:Python 资源全名:webpack-s3-2019.8.30.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Full_Webpack-45.4.2608-IT310_Full_Webpack.exe
**PyPI 官网下载 | django-webpack-loader-0.1.2.tar.gz** 在Python的世界里,`PyPI`(Python Package Index)是官方的第三方软件包仓库,它为Python开发者提供了一个集中化的地方来发布、查找和安装软件包。本资源`...
`webpack-plugin-hash-output-master` 提供了一个插件,用于在 Webpack 构建过程中生成包含哈希值的输出文件名,确保每次代码变更时,变动的文件名能反映这些变化,从而实现浏览器缓存的更新。 这个压缩包可能包含...
Webpack:Webpack高级主题:代码分割.docx
const CdnWebpackPlugin = require('webpack-cdn-plugin'); module.exports = { // 其他配置... plugins: [ new CdnWebpackPlugin({ modules: [{ name: 'react', var: 'React', // 对应于 import React from ...
通过这个库,你可以利用Webpack的强大功能,如代码分割、热模块替换等,同时保持Django的便捷性。 - 安装:你可以使用Python的包管理器pip来安装这个库,例如`pip install django_webpack_bundle-1.0.1-py2.py3-...
解决vue-cli · Failed to download repo vuejs-templates/...使用方法: 1、将webpack放到C:\Users\admin\.vue-templates\webpack下面,admin是当前登录用户名 2、执行vue init webpack your_vue_app --offline即可
Webpack 是一个流行的模块打包工具,尤其在开发 React 应用时不可或缺。`02.webpack-base_webpackSetting.rar` 文件包含的资源详细介绍了如何配置 Webpack 以支持 React 开发。下面将深入探讨 Webpack 配置的关键点...
资源分类:Python库 所属语言:Python 使用前提:需要解压 资源全名:django_webpack4_loader-0.0.2-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
【标题】"next-missing-terser-webpack-plugin-dep-源码" 提供的是一个用于Next.js项目的优化插件——Next.js Missing Terser Webpack Plugin的源代码。这个插件是针对Webpack构建过程中的一个特定问题设计的,即在...
资源来自pypi官网。 资源全名:django_webpack_bundle-1.0.1-py2.py3-none-any.whl
copy-webpack-plugin-demo.rar 拷贝文件demo, 现成案例,可以参考使用 免积分下载地址 https://download.lllomh.com/cliect/#/product/JB23148366892270
Webpack 是一个流行的模块打包工具,它能够将 JavaScript、CSS、图片等资源文件转换并整合到一个或多个可部署的静态资源文件中。在 Webpack 的生态中,Loader 和 Plugins 是两个核心概念,它们分别用于处理不同类型...
Babel插件可将import() require.ensure为Webpack的require.ensure。 请注意,编写此代码后,Webpack 2已 。 注意:需要Babylon v6.12.0才能正确解析动态导入。 安装 $ npm install babel-plugin-dynamic-import-...
jfmd-webpack-loader jfmd-webpack-loader 用于编译定制格式的markdown 文件,方便搭建纯静态的博客。 安装 yarn add jfmd-webpack-loader 用法: webpack.config.js ... { test: /\.md$/, loader: 'jfmd-webpack-...