预获取prefetch和预加载preload
- prefetch(预获取):将来某些导航下可能需要的资源
- preload(预加载):当前导航下可能需要资源
简单示例,有一个 HomePage 组件,其内部渲染一个 LoginButton 组件,然后在点击后按需加载 LoginModal 组件。
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。
import(/* webpackPreload:true */ 'ChartingLibrary');
页面加载ChartComponent时,在请求ChartComponent.js的同时,还会通过 请求charting-library-chunk。
不正确使用webpackPreload会有损性能,因为会同时加载js
通过插件设置文件cdn
html-webpack-plugin设置
首先设置cdn的配置文件
exports.externalConfig = [cdn:{css: ["https://cdn.jsdelivr.net/npm/vant@1.5/lib/index.css"],js: ["https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js","https://unpkg.com/vuex","https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.auto.js","https://cdn.jsdelivr.net/npm/vant@1.5/lib/vant.min.js","https://unpkg.com/axios/dist/axios.min.js",],wxjs: ["https://res.wx.qq.com/open/js/jweixin-1.2.0.js",],}];
HtmlWebpackPlugins插件导出cdn,配置cdn参数,改插件的作用是动态构建html页
new HtmlWebpackPlugin({filename: 'index.html',template: 'index.html',inject: true,cdnConfig: externalConfig, // cdn配置onlyCss: true,}),
html-webpack-externals-plugin设置
基础库不打包,直接CDN引入
开发时,有时候需要引入一些基础库,如react开发时,每个组件都需要引入react和react-dom,打包时这两个基础库体积较大,导致构建出来的包提交变大,将react和react-dom在html中用CDN引入
// wepack.config.js// 基础库不打包,直接CDN引入const HtmlWebpackExternalsPlugin = require('html-webpack-externals-plugin');module.exports = {new HtmlWebpackExternalsPlugin({externals: [{module: 'react',entry: 'https://11.url.cn/now/lib/16.2.0/react.min.js',global: 'React'},{module: 'react-dom',entry: 'https://11.url.cn/now/lib/16.2.0/react-dom.min.js',global: 'ReactDOM'}]})};
编译后在html中使用
<script type="text/javascript" src="https://11.url.cn/now/lib/16.2.0/react.min.js"></script><script type="text/javascript" src="https://11.url.cn/now/lib/16.2.0/react-dom.min.js"></script>
外部扩展-Externals
该配置提供一个直接通过script脚本引入CDN资源,而不是打包。防止将某些import的包打包到bundle中。
<scriptsrc="https://code.jquery.com/jquery-3.1.0.js"integrity="sha256-slogkvB1K3VOkzAI8QITxV3VzpOnkeNVsKvtkYLMjfk="crossorigin="anonymous"></script>
然后设置webpack.config.js
module.exports = {externals: {jquery: 'jQuery',lodash : {commonjs: 'lodash',amd: 'lodash',root: '_' // 指向全局变量}}};
然后就可以直接在项目使用jquery,可以剥离那些不需要改动的第三方依赖模块。
import $ from 'jquery';$('.my-element').animate(/* ... */);
