• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
邹天得
博客园    首页    新随笔    联系   管理    订阅  订阅

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

http://stef.iteye.com/blog/2364989

 

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

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

 

动态引入

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

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

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

index.js

 

Js代码  
  1. functiondetermineDate(){  
  2.   import('moment').then(function(moment){  
  3.     console.log(moment().format());  
  4.   }).catch(function(err){  
  5.     console.log('Failed to load moment', err);  
  6.   });  
  7. }  
  8.    
  9. determineDate();  

 

 

许诺polyfill

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

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

在你应用的入口点里:

 

Js代码  
  1. import Es6Promise from'es6-promise';  
  2. Es6Promise.polyfill();  
  3. // or  
  4. import'es6-promise/auto';  
  5. // or  
  6. import Promise from'promise-polyfill';  
  7. if(!window.Promise){  
  8.   window.Promise = Promise;  
  9. }  
  10. // or ...  

 

通过Babel使用

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

Js代码  
  1. npm install --save-dev babel-core babel-loader babel-plugin-syntax-dynamic-import babel-preset-es2015  
  2. # for this example  
  3. npm install --save moment  

 

index-es2015.js

Js代码  
  1. functiondetermineDate(){  
  2.   import('moment')  
  3.     .then(moment =>moment().format('LLLL'))  
  4.     .then(str => console.log(str))  
  5.     .catch(err => console.log('Failed to load moment', err));  
  6. }  
  7.    
  8. determineDate();  

 

webpack.config.js

Js代码  
  1. module.exports ={  
  2.   entry:'./index-es2015.js',  
  3.   output:{  
  4.     filename:'dist.js',  
  5.   },  
  6.   module:{  
  7.     rules:[{  
  8.       test:/\.js$/,  
  9.       exclude:/(node_modules)/,  
  10.       use:[{  
  11.         loader:'babel-loader',  
  12.         options:{  
  13.           presets:[['es2015',{modules:false}]],  
  14.           plugins:['syntax-dynamic-import']  
  15.         }  
  16.       }]  
  17.     }]  
  18.   }  
  19. };  

 

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

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

或

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

 

通过Babel和async/await使用

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

Js代码  
  1. npm install --save-dev babel-plugin-transform-async-to-generator babel-plugin-transform-regenerator babel-plugin-transform-runtime  

 

index-es2017.js

Js代码  
  1. asyncfunctiondetermineDate(){  
  2.   const moment =awaitimport('moment');  
  3.   returnmoment().format('LLLL');  
  4. }  
  5.    
  6. determineDate().then(str => console.log(str));  

 

webpack.config.js

Js代码  
  1. module.exports ={  
  2.   entry:'./index-es2017.js',  
  3.   output:{  
  4.     filename:'dist.js',  
  5.   },  
  6.   module:{  
  7.     rules:[{  
  8.       test:/\.js$/,  
  9.       exclude:/(node_modules)/,  
  10.       use:[{  
  11.         loader:'babel-loader',  
  12.         options:{  
  13.           presets:[['es2015',{modules:false}]],  
  14.           plugins:[  
  15.             'syntax-dynamic-import',  
  16.             'transform-async-to-generator',  
  17.             'transform-regenerator',  
  18.             'transform-runtime'  
  19.           ]  
  20.         }  
  21.       }]  
  22.     }]  
  23.   }  
  24. };  

 

import替代require.ensuse?

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

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

Js代码  
  1. require.ensure([],function(require){  
  2.   var foo =require("./module");  
  3. },"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

 

网页链接

  • Lazy Loading ES2015 Modules in the Browser

-- End -- 

posted on 2017-11-14 12:13  邹天得  阅读(549)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3