在没有 前端工程化以前,基本上是咱们是代码一把梭,把所须要的库和本身的代码堆砌在一块儿,而后自上往下的引用就能够了。
那个时代咱们没有公用的cdn,也没有什么特别好的方法来优化加载js的速度。最多用如下几个方案。html
固然那个时期的代码也没有像如今的前端的代码量和复杂度那么高。前端
与其说 Webpack 是一个模块打包器,倒不如说 Webpack 是一份前端规范。jquery
对于咱们代码中所须要的代码库没有大量使用,好比说某种组件库咱们仅仅只使用了 二、3个组件的状况下。咱们更多须要按需加载功能。
比方说在 MATERIAL-UI 咱们能够用git
import TextField from '@material-ui/core/TextField';
import Popper from '@material-ui/core/Popper';
import Paper from '@material-ui/core/Paper';
import MenuItem from '@material-ui/core/MenuItem';
import Chip from '@material-ui/core/Chip';
复制代码
代替github
import {
TextField,
Popper,
Paper,
MenuItem,
Chip
} from '@material-ui'
复制代码
这样就实现了按需加载,而不是动辄须要整个组件库。可是这样的代码中这样代码并很差书写。咱们就须要一个帮助咱们转换代码的库。这能够参考 Babel 插件手册 以及 简单实现项目代码按需加载 来实现咱们的需求。windows
若是咱们的库被当前的项目大量使用了,按需加载其实就未必是最好的方法了,若是咱们的服务器不是特别好的状况下咱们可使用 Webpack 的 externals 配置来优化项目的js。就简单的对 externals 配置简单说明一下。externals实际上是在全局中的获得库文件。后端
// 页面中使用 cdn,这样的话,咱们就会在 window 中获得 jQuery
// 也就是 global.JQuery 浏览器中 global === window
<script
src="https://code.jquery.com/jquery-3.1.0.js"
integrity="sha256-slogkvB1K3VOkzAI8QITxV3VzpOnkeNVsKvtkYLMjfk="
crossorigin="anonymous">
</script>
// 在项目中导入 jquery 使用
import $ from 'jquery';
// 配置中 左边是 配置的 jquery 告诉 Webpack 不须要导入
// 配置中 右边是 配置的 JQuery 告诉 Webpack 记载 jquery 时候使用 global.JQuery
externals: {
jquery: 'jQuery'
}
复制代码
可是使用 externals 曾遇到这样的状况。我在使用 material-ui 组件库时候发现该库在全局导出的代码是 material-ui。
也就是:前端工程化
externals: {
'@material-ui/core': 'material-ui'
}
复制代码
此时会发生导入错误,错误缘由为: window.material-ui。
原本我是想要引入material-ui,却 - 符号变为了减号。
原本想要利用用 ['material-ui'] 来替换,却发现行不通: windows.['material-ui']
解决方法:浏览器
externals: {
'@material-ui/core': "window['material-ui']"
}
复制代码
由于 window 对象有本身引用本身,因此 window === window.window.window。因此代码为 window.window['material-ui']。能够参考 MDN Window.window性能优化
在当前所须要 js 文件不须要大量使用同时须要的 js 文件是不须要开始时加载(如 React, React-Router 一类)的时候咱们依然可使用loadjs来加载(好比说 图标库一类,只在某一些页面使用)。
对于在 HTTP2 中合并多个 小js文件未必好。由于在 HTTP2 中,HTTP 请求是廉价的,合并便再也不显得有优点。
固然了,BigPipe 方案不是针对单页面应用程序。并且对于先后端的技术要求较高,因此对于项目未必是最有效的方案。
现现在也可使用一些其余的方法。例如 Service Worker,Wasm 等一系列方案。不知道还有什么其余方法,也能够介绍给我。
新版卖家中心 Bigpipe 实践(一)
新版卖家中心 Bigpipe 实践(二)
Babel 插件手册
简单实现项目代码按需加载
MDN Window.window