在项目开发过程当中,遇到须要优化打包速度的问题。咱们能够经过分离第三库的形式优化构建速度。javascript
在项目中咱们常常会用到jquery,vue,echarts等第三方库。咱们能够把这些第三库和本身的开发代码分离开来,只须要在第一次构建的时候进行打包,之后就不会再去编译这些第三方库,从而优化了打包的速度。html
DLLPlugin
和 DLLReferencePlugin
用某种方法实现了拆分 bundles,同时还大大提高了构建的速度。vue
这个插件是在一个额外的独立的 webpack(通常设置为webpack.dll.config.js) 设置中建立一个只有 dll 的 bundle(dll-only-bundle)。 这个插件会生成一个名为 manifest.json
的文件,这个文件是用来让 DLLReferencePlugin
映射到相关的依赖上去的。java
在给定的 path
路径下建立一个名为 manifest.json
的文件。 这个文件包含了从 require
和 import
的request到模块 id 的映射。 DLLReferencePlugin
也会用到这个文件。jquery
这个插件是在 webpack 主配置文件中设置的, 这个插件把只有 dll 的 bundle(们)(dll-only-bundle(s)) 引用到须要的预编译的依赖。webpack
经过引用 dll 的 manifest 文件来把依赖的名称映射到模块的 id 上,以后再在须要的时候经过内置的 __webpack_require__
函数来 require
他们web
与output.library
保持name
的一致性。
这个插件支持两种模式,分别是做用域(scoped)和映射(mapped)。npm
dll 中的内容能够在模块前缀下才能被引用,举例来讲,令scope = "xyz"
的话,这个 dll 中的名为 abc
的文件能够经过 require("xyz/abc")
来获取json
dll 中的内容被映射到了当前目录下。若是一个被 require
的文件符合 dll 中的某个文件(解析以后),那么这个dll中的这个文件就会被使用。bash
因为这是在解析了 dll 中每一个文件以后才发生的,相同的路径必须可以确保这个 dll bundle 的使用者(不必定是人,可指某些代码)有权限访问。 举例来讲, 假如一个 dll bundle 中含有 loadash
库 以及 文件abc
, 那么 require("lodash")
和 require("./abc")
都不会被编译进主要的 bundle文件,而是会被 dll 所使用。
webpack.config.js
webpack.dll.config.js
src
index.html
pages
index.js
static
jquery.js
package.json复制代码
npm install webpack webpack-cli html-webpack-plugin --save-dev 复制代码
npm install jquery --save 复制代码
var HtmlWebpackPlugin = require('html-webpack-plugin');var path = require('path');var webpackConfig = { mode:'development', entry: path.resolve(__dirname,'./src/pages/index.js'), output: { path: path.resolve(__dirname, './dist'), filename: 'index_bundle.js' }, plugins: [new HtmlWebpackPlugin({ template:path.resolve(__dirname,'./src/index.html') })]};module.exports = webpackConfig;复制代码
const path = require('path')const webpack = require('webpack')module.exports = { mode: 'development', entry: { // 定义程序中打包公共文件的入口文件vendor.js vendor: ['jquery'], }, output: { path: path.resolve('./src/dll'), filename: '[name].dll.js', library: '[name]_[hash]', libraryTarget: 'this' }, plugins: [ new webpack.DllPlugin({ // 定义程序中打包公共文件的入口文件vendor.js context: __dirname, // manifest.json文件的输出位置 path: path.join('./src', 'dll', '[name]-manifest.json'), // 定义打包的公共vendor文件对外暴露的函数名 name: '[name]_[hash]' }) ]}
// 第一次运行webpack --config webpack.dll.config.js复制代码
...
plugins: [ new HtmlWebpackPlugin({ template: path.resolve(__dirname, './src/index.html') }), // dllPlugin关联配置 // 新增代码 new webpack.DllReferencePlugin({ context: __dirname, // 跟dll.config里面DllPlugin的context一致 manifest: require('./src/dll/vendor-manifest.json') }), ]
...
// 第二次运行webpack复制代码
运用DllPlugin插件,把第三方库分离出来,可以大幅提升打包的速度