预获取prefetch和预加载preload

  • prefetch(预获取):将来某些导航下可能需要的资源
  • preload(预加载):当前导航下可能需要资源

简单示例,有一个 HomePage 组件,其内部渲染一个 LoginButton 组件,然后在点击后按需加载 LoginModal 组件。

  1. import(/* webpackPrefetch: true */ 'LoginModal');

生成 <link rel="prefetch" href="login-modal-chunk.js"> 并追加到页面头部,浏览器在闲置时间预取 login-modal-chunk.js 文件。
与 prefetch 指令相比,preload 指令有许多不同之处:

prefetch preload
在父chunk加载结束后,开始加载 在父chunk加载时,以并行的方式加载
在浏览器闲置时下载 具有同样优先级,会立即下载
用于未来的某个时刻 在父chunk中立即请求,用于当下时刻

preload的示例:
有一个Component,依赖一个大library第三方库,所以应该将其分离到独立的chunk中。假设有个图表组件ChartComponent组件,需要依赖体积巨大的ChartingLibrary库。会在渲染是显示一个LoadingIndicator(进度条)组件,然后立即按需导入ChartingLibrary。

  1. import(/* webpackPreload:true */ 'ChartingLibrary');

页面加载ChartComponent时,在请求ChartComponent.js的同时,还会通过 请求charting-library-chunk。
不正确使用webpackPreload会有损性能,因为会同时加载js

通过插件设置文件cdn

html-webpack-plugin设置

首先设置cdn的配置文件

  1. exports.externalConfig = [
  2. cdn:{
  3. css: ["https://cdn.jsdelivr.net/npm/vant@1.5/lib/index.css"],
  4. js: [
  5. "https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js",
  6. "https://unpkg.com/vuex",
  7. "https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.auto.js",
  8. "https://cdn.jsdelivr.net/npm/vant@1.5/lib/vant.min.js",
  9. "https://unpkg.com/axios/dist/axios.min.js",
  10. ],
  11. wxjs: [
  12. "https://res.wx.qq.com/open/js/jweixin-1.2.0.js",
  13. ],
  14. }
  15. ];

HtmlWebpackPlugins插件导出cdn,配置cdn参数,改插件的作用是动态构建html页

  1. new HtmlWebpackPlugin({
  2. filename: 'index.html',
  3. template: 'index.html',
  4. inject: true,
  5. cdnConfig: externalConfig, // cdn配置
  6. onlyCss: true,
  7. }),

html-webpack-externals-plugin设置

基础库不打包,直接CDN引入
开发时,有时候需要引入一些基础库,如react开发时,每个组件都需要引入react和react-dom,打包时这两个基础库体积较大,导致构建出来的包提交变大,将react和react-dom在html中用CDN引入

  1. // wepack.config.js
  2. // 基础库不打包,直接CDN引入
  3. const HtmlWebpackExternalsPlugin = require('html-webpack-externals-plugin');
  4. module.exports = {
  5. new HtmlWebpackExternalsPlugin({
  6. externals: [
  7. {
  8. module: 'react',
  9. entry: 'https://11.url.cn/now/lib/16.2.0/react.min.js',
  10. global: 'React'
  11. },
  12. {
  13. module: 'react-dom',
  14. entry: 'https://11.url.cn/now/lib/16.2.0/react-dom.min.js',
  15. global: 'ReactDOM'
  16. }
  17. ]
  18. })
  19. };

编译后在html中使用

  1. <script type="text/javascript" src="https://11.url.cn/now/lib/16.2.0/react.min.js"></script>
  2. <script type="text/javascript" src="https://11.url.cn/now/lib/16.2.0/react-dom.min.js"></script>

外部扩展-Externals

该配置提供一个直接通过script脚本引入CDN资源,而不是打包。防止将某些import的包打包到bundle中。

  1. <script
  2. src="https://code.jquery.com/jquery-3.1.0.js"
  3. integrity="sha256-slogkvB1K3VOkzAI8QITxV3VzpOnkeNVsKvtkYLMjfk="
  4. crossorigin="anonymous">
  5. </script>

然后设置webpack.config.js

  1. module.exports = {
  2. externals: {
  3. jquery: 'jQuery',
  4. lodash : {
  5. commonjs: 'lodash',
  6. amd: 'lodash',
  7. root: '_' // 指向全局变量
  8. }
  9. }
  10. };

然后就可以直接在项目使用jquery,可以剥离那些不需要改动的第三方依赖模块。

  1. import $ from 'jquery';
  2. $('.my-element').animate(/* ... */);