`

[译]webpack官网文档 :指南 -- 7.代码分割 - 使用import()

阅读更多

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

原文地址:https://webpack.js.org/guides/code-splitting-import/

 

动态引入

目前,一个把类函数的模块加载语法import()添加到ECMAScript的提议,正在讨论中。

ES2015加载器细则定义import()为一个能在运行时动态加载ES2015模块的方法。

webpackimport()当作一个分割点,把需求的模块放到单独的代码块里。import()把模块名当作参数,返回一个许诺:import(name) -> Promise

index.js

 

functiondetermineDate(){
  import('moment').then(function(moment){
    console.log(moment().format());
  }).catch(function(err){
    console.log('Failed to load moment', err);
  });
}
 
determineDate();

 

 

许诺polyfill

如果你在旧浏览器里使用import(),别忘了用像es6-promise或者promise-polyfillpolyfillshim 许诺。

(译者注:没找到合适的词来译shimpolyfill,其作用是让各版本的浏览器兼容Javascript方法)

在你应用的入口点里:

 

import Es6Promise from'es6-promise';
Es6Promise.polyfill();
// or
import'es6-promise/auto';
// or
import Promise from'promise-polyfill';
if(!window.Promise){
  window.Promise = Promise;
}
// or ...

 

通过Babel使用

如果你想通过Babel使用import,你需要安装或者添加syntax-dynamic-import插件,为避免编译错误它仍然在第三阶段。等提议完全加到细则里之后这将完全没有必要。

npm install --save-dev babel-core babel-loader babel-plugin-syntax-dynamic-import babel-preset-es2015
# for this example
npm install --save moment

 

index-es2015.js

functiondetermineDate(){
  import('moment')
    .then(moment =>moment().format('LLLL'))
    .then(str => console.log(str))
    .catch(err => console.log('Failed to load moment', err));
}
 
determineDate();

 

webpack.config.js

module.exports ={
  entry:'./index-es2015.js',
  output:{
    filename:'dist.js',
  },
  module:{
    rules:[{
      test:/\.js$/,
      exclude:/(node_modules)/,
      use:[{
        loader:'babel-loader',
        options:{
          presets:[['es2015',{modules:false}]],
          plugins:['syntax-dynamic-import']
        }
      }]
    }]
  }
};

 

不用syntax-dynamic-import插件的话将会发生下面的编译错误:

  • Module build failed: SyntaxError: 'import' and 'export' may only appear at the top

  • Module build failed: SyntaxError: Unexpected token, expected {

 

通过Babelasync/await使用

ES2017 async/await import()一起使用:

npm install --save-dev babel-plugin-transform-async-to-generator babel-plugin-transform-regenerator babel-plugin-transform-runtime

 

index-es2017.js

asyncfunctiondetermineDate(){
  const moment =awaitimport('moment');
  returnmoment().format('LLLL');
}
 
determineDate().then(str => console.log(str));

 

webpack.config.js

module.exports ={
  entry:'./index-es2017.js',
  output:{
    filename:'dist.js',
  },
  module:{
    rules:[{
      test:/\.js$/,
      exclude:/(node_modules)/,
      use:[{
        loader:'babel-loader',
        options:{
          presets:[['es2015',{modules:false}]],
          plugins:[
            'syntax-dynamic-import',
            'transform-async-to-generator',
            'transform-regenerator',
            'transform-runtime'
          ]
        }
      }]
    }]
  }
};

 

import替代require.ensuse

好消息:加载代码块失败的问题现在可以解决,因为他们是基于Promise

警告:require.ensure考虑到了通过第三个参数的可选配置来简易命名代码块,但是import API还没有提供这个功能。如果你想保留这个功能,你可以继续使用require.ensure

require.ensure([],function(require){
  var foo =require("./module");
},"custom-chunk-name");

 

弃用System.import

webpack里,使用System.import是不符合提议细则的,所以它在v2.1.0-beta.28里被弃用,支持import()

 

一些例子

  • https://github.com/webpack/webpack/tree/master/examples/harmony
  • https://github.com/webpack/webpack/tree/master/examples/code-splitting-harmony
  • https://github.com/webpack/webpack/tree/master/examples/code-splitting-native-import-context

 

网页链接

-- End -- 

 

0
0
分享到:
评论

相关推荐

    webpack 中文指南

    - **官方文档**:[Webpack官网](https://webpack.js.org/) - **中文指南**:[Webpack中文指南](https://zhcn.webpack.js.org/) - **社区资源**:GitHub、Stack Overflow等社区讨论。 ### 结语 Webpack作为一个强大...

    Webpack2 中文文档 pdf

    - **代码拆分**:Webpack 2 支持动态导入 (`import()`),这使得代码分割变得更加简单和灵活。通过使用 `require.ensure` 或动态导入语法,可以轻松实现按需加载。 #### 代码分割 - **CSS**:可以使用特定的 loader ...

    element-ui-helper-master.zip

    Element UI Helper Master可能包含了一些性能优化技巧,如懒加载(Lazy Loading)、按需引入(On Demand Import)、代码分割(Code Splitting)等,以减少项目体积并提升加载速度。 5. **最佳实践**: 项目可能包含了一套...

    使用PreactWebpack2的一步一步指南

    查阅Webpack文档,了解如何扩展和优化你的配置。 ### 总结 通过以上步骤,你已经成功地搭建了一个使用Preact和Webpack2的基础项目。随着对这两个库的深入理解,你可以逐步定制和优化项目,以适应更复杂的应用场景...

    webpack-guide:Webpack指南

    **tree shaking**:Webpack 的一项优化技术,用于移除未使用的JavaScript代码,基于 ES6 模块的静态性质实现,有助于减小生产环境的代码体积。 **Source Maps**:Source Maps 可以帮助开发者在浏览器的开发者工具中...

    webpack学习指南

    Webpack 是一个现代JavaScript应用程序的静态模块打包工具。它在开发过程中扮演着重要...通过阅读提供的"xmind"文档,你将获得更详细的Webpack指南,包括概念解析、功能介绍和实例演示,进一步提升你的Webpack技能。

    imweb-tpl-loader:imweb-tpl-loader

    3. **代码拆分**:通过Webpack的代码分割功能,imweb-tpl-loader可以帮助优化项目,只在需要时加载模板,从而减少首屏加载时间。 4. **性能优化**:编译后的模板函数在运行时执行速度快,因为它们已经被转化为...

    前端项目-mo.zip

    如果`docs`目录存在,那么可能包含API文档、使用指南和示例,帮助开发者理解和使用“mo”库。 9. **许可证和README**: 项目通常会有LICENSE文件,规定了软件的使用权限和条件。README文件则提供了项目简介、安装...

    高性能JavaScript.pdf

    - **自动化构建工具**:使用Webpack、Gulp等工具自动完成代码压缩、合并等任务。 - **持续集成/持续部署(CI/CD)**:通过自动化流程确保代码质量并快速发布应用。 **技术细节:** - 构建工具可以帮助开发者自动化...

    JavaScript项目的一组最佳实践.zip

    9. **性能优化**:利用Webpack或Rollup进行代码打包和优化,如代码分割、Tree Shaking等,提高加载速度。 10. **安全**:遵循OWASP JavaScript Top 10,避免常见的安全风险,如XSS、CSRF等,并使用 ESLint 的 ...

    angular-es6-sample:带有ECMAScript 2015ES6,Bootstrap 4和Webpack的AngularJS 1.5+示例

    通常,这意味着开发者希望读者能查看项目的GitHub仓库或其他文档资源,以获取详细的安装指南、使用方法和项目结构等信息。 **标签解析:** - **angularjs**:这是一个基于JavaScript的前端框架,用于构建动态Web...

    skeleton-js:JavaScript项目的骨架项目结构

    例如,源代码中的每个功能可以被封装为独立的模块,通过`require`或`import`语句进行导入和使用。 ### 4. 测试框架 测试是软件开发中不可或缺的一部分。`skeleton-js` 的`test`目录下可能包含配置文件和测试用例,...

    url2emoji:缩短网址到表情符号-源码

    4. **文档(README.md)**:项目介绍、安装和使用指南。 5. **构建脚本(build scripts)**:如Gulp、Webpack等,用于编译、打包和优化代码。 6. **许可证文件(LICENSE)**:定义项目开源许可协议,如MIT、Apache...

    webpack4 升级迁移的实现

    但是对于使用webpack 1的用户,由于配置语法和内部机制的变化较大,建议仔细阅读官方文档和迁移指南,了解每一个配置项和功能的变化,确保迁移过程中的平滑过渡。 在进行webpack4的升级迁移时,首先需要更新***k的...

    前端开源库-tau-tools

    3. **模块管理**: τ工具支持ES6模块化,允许开发者使用import/export语法组织代码,同时自动处理模块间的依赖关系,简化了代码结构和维护。 4. **热重载**: τ工具具备热重载功能,在开发过程中修改代码后,页面会...

    crazyxiang.github.io

    7. `README.md`:介绍项目背景、安装步骤、使用指南和贡献方式。 8. `LICENSE`:声明项目的开源许可证类型。 9. `scripts`或`build`目录:包含构建工具的配置和脚本,如Webpack、Gulp或Grunt。 10. `src`目录:存放...

    FARM-stack-demo

    5. **模块化**:使用ES6的模块系统(import/export)进行代码组织,使得代码可重用性和可维护性更高。 6. **测试框架**:为了确保代码质量,项目可能包含了Jest或Mocha等测试框架,配合Chai或Enzyme等断言库,进行...

    乌鲁尼奥伯特

    4. **构建工具**:如Webpack、Rollup或Gulp,它们将源代码打包成适合浏览器执行的格式,并可以进行优化,如代码分割、压缩和混淆。 5. **包管理器**:项目可能使用npm(Node Package Manager)或yarn来管理依赖关系...

    alfinweblanjut.github.io

    标题 "alfinweblanjut.github.io" 暗示这是一个个人或项目网站的源代码存储库,托管在GitHub上。通常,这种类型的仓库包含了网页的HTML、CSS和JavaScript文件,用于构建和展示一个静态网站。描述中的内容与标题相同...

    NugrahSMD

    【压缩包子文件的文件名称列表】:NugrahSMD-main 通常,"main"在代码仓库中指的是项目的主目录或入口点,可能包含项目的源代码、配置文件、README文档等。这个目录可能包括以下结构: 1. `src/` - 源代码文件夹,...

Global site tag (gtag.js) - Google Analytics