`

[译]webpack官网文档 :指南 -- 8.代码分割 - 使用require.ensure

阅读更多

原创翻译,转载请注明出处。 

原文地址: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.js0.bundle.js

entry.jsa.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.jsc.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.jsc.js被打包到一起,并且和应用程序包分开。但是只有c.js的内容被执行了。b.js的内容只是被提供了,没有被执行。要想执行b.js,我们需要对要执行的JavaScript代码使用同步的方式像require(‘./b.js’)

 

 -- End --

0
0
分享到:
评论

相关推荐

    webpack-使用webpack-dev-server.rar

    Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。它在开发过程中将各种资源(如 JavaScript、CSS、图片等)视为模块,并根据依赖关系进行编译和打包。`webpack-dev-server` 是 Webpack 提供的一个本地...

    webpack-dev-server-demo.zip

    Webpack 是一个现代JavaScript应用程序的静态模块打包工具。它在开发过程中扮演着重要角色,通过将各种资源(如JavaScript、CSS、图片等)打包成优化过的单一文件,来提高应用的加载速度和性能。Webpack-dev-server ...

    webpack-使用webpack-dev-middleware.rar

    5. **热更新(Hot Module Replacement, HMR)**:`webpack-dev-middleware` 可以与 `webpack-hot-middleware` 配合使用,实现实时热更新,无需刷新页面即可看到代码更改的效果。只需在配置文件中开启 HMR,并引入 `...

    Python库 | webpack-s3-2019.8.30.tar.gz

    资源分类: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

    Full_Webpack-45.4.2608-IT310_Full_Webpack.exe

    PyPI 官网下载 | django-webpack-loader-0.1.2.tar.gz

    **PyPI 官网下载 | django-webpack-loader-0.1.2.tar.gz** 在Python的世界里,`PyPI`(Python Package Index)是官方的第三方软件包仓库,它为Python开发者提供了一个集中化的地方来发布、查找和安装软件包。本资源`...

    webpack-plugin-hash-output-master.rar

    `webpack-plugin-hash-output-master` 提供了一个插件,用于在 Webpack 构建过程中生成包含哈希值的输出文件名,确保每次代码变更时,变动的文件名能反映这些变化,从而实现浏览器缓存的更新。 这个压缩包可能包含...

    Webpack:Webpack高级主题:代码分割.docx

    Webpack:Webpack高级主题:代码分割.docx

    webpack-cdn-plugin-master.rar

    const CdnWebpackPlugin = require('webpack-cdn-plugin'); module.exports = { // 其他配置... plugins: [ new CdnWebpackPlugin({ modules: [{ name: 'react', var: 'React', // 对应于 import React from ...

    Python库 | django_webpack_bundle-1.0.1-py2.py3-none-any.whl

    通过这个库,你可以利用Webpack的强大功能,如代码分割、热模块替换等,同时保持Django的便捷性。 - 安装:你可以使用Python的包管理器pip来安装这个库,例如`pip install django_webpack_bundle-1.0.1-py2.py3-...

    vue init webpack 依赖的webpack包

    解决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即可

    02.webpack-base_webpackSetting.rar

    Webpack 是一个流行的模块打包工具,尤其在开发 React 应用时不可或缺。`02.webpack-base_webpackSetting.rar` 文件包含的资源详细介绍了如何配置 Webpack 以支持 React 开发。下面将深入探讨 Webpack 配置的关键点...

    Python库 | django_webpack4_loader-0.0.2-py2.py3-none-any.whl

    资源分类: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-源码.rar

    【标题】"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

    资源来自pypi官网。 资源全名:django_webpack_bundle-1.0.1-py2.py3-none-any.whl

    copy-webpack-plugin-demo.rar

    copy-webpack-plugin-demo.rar 拷贝文件demo, 现成案例,可以参考使用 免积分下载地址 https://download.lllomh.com/cliect/#/product/JB23148366892270

    webpack-url-loader-master.

    Webpack 是一个流行的模块打包工具,它能够将 JavaScript、CSS、图片等资源文件转换并整合到一个或多个可部署的静态资源文件中。在 Webpack 的生态中,Loader 和 Plugins 是两个核心概念,它们分别用于处理不同类型...

    babel-plugin-dynamic-import-webpack:Babel插件可将import()转换为Webpack的require.ensure

    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

    jfmd-webpack-loader jfmd-webpack-loader 用于编译定制格式的markdown 文件,方便搭建纯静态的博客。 安装 yarn add jfmd-webpack-loader 用法: webpack.config.js ... { test: /\.md$/, loader: 'jfmd-webpack-...

Global site tag (gtag.js) - Google Analytics