webpack生产环境优化:dll
转载请注明 来源:http://www.eword.name/
Author:eword
Email:eword@eword.name
webpack生产环境优化:dll
- dll动态链接库
- 目的:单独的将多个指定的第三方库打包成一个chunk。
- 意义:将不同的库分割开来,实现代码分割和避免重复打包,在节省打包时间的同时方便按需加载和预加载的实现。
一、打包指定的第三方库
1.1、创建dll打包配置文件
根目录下创建
webpack.dll.js
配置文件
/* 路径:./webpack.dll.js (名字可任意取) 使用dll技术,对某些第三方库(如:jquery、react、vue…)进行单独打包 当你运行 webpack 时,默认查找 webpack.config.js 配置文件 需求: 需要运行 webpack.dll.js 打包 > webpack --config webpack.dll.js */ const { resolve } = require('path'); const webpack = require('webpack'); module.exports = { entry: { // 最终打包生成的[name]-->jquery // ['jquery']--> 要打包的库是jquery jquery: ['jquery'] }, output: { filename: '[name].js', path: resolve(__dirname, 'dll'), library: '[name]_[hash]' //打包的库里面向外泰露出去的内容叫什么名字。 }, plugins: [ // 打包生成一个manifest.json文件,提供和jquery映射关系。 new webpack.DllPlugin({ name: '[name]_[hash]', // 映射库暴露的内容名称 path: resolve(__dirname, 'dll/manifest.json'), // 映射文件输出路径 }) ], mode: 'production' }
1.2、打包dll
# 根据webpack.dll.js配置的内容打包 > webpack --config webpack.dll.js
1.3、工程文件目录
. ├── dll // 打包后生成的目录 │ ├── jquery.js // 根据webpack.dll.js配置独立打包出来的jquery │ └── manifest.json //映射文件 ├── src │ ├── index.html │ └── index.js ├── webpack.config.js └── webpack.dll.js //打包配置文件
二、应用单独打包的dll
2.1、修改webpack.config.js
/* webpack.config.js webpack的配置文件 路径: ./webpack.config.js */ // resolve用来拼接绝对路径的方法 const { resolve } = require('path'); // 引入打包 html 文件的插件 html-webpack-plugin const HtmlWebpackPlugin = require('html-webpack-plugin'); // 引入webpack const webpack = require('webpack'); // 引入add-asset-html-webpack-plugin const AddAssetHtmlWebpackPlugin =require('add-asset-html-webpack-plugin'); module.exports = { // webpack配置 // 入口起点文件 entry: './src/index.js', // 输出 output: { // 输出文件名 filename: 'built.js', // 输出路径 // __dirname nodejs的变量,代表当前文件的目录绝对路径 path: resolve(__dirname, 'build'), }, // loader的配置 module: { rules: [ // 详细loader配置 //不同文件必须配置不同loader处理 // 打包 css 文件的详细loader配置 { // 匹配哪些文件 test: /\.css$/, // 使用哪些loader进行处理 use: [ // use数组中loader执行顺序:从右到左,从下到上依次执行 // 创建style标签,将js中的样式资源插入进行,添加到head中生效 'style-loader', // 将css文件变成commonjs模块加载js中,里面内容是样式字符串 'css-loader', ], }, //打包less 文件的详细loader配置 { //匹配哪些文件 test: /\.less$/, //使用哪些loader进行处理 use: [ // use数组中loader执行顺序:从右到左,从下到上依次执行 //创建style标签,将js中的样式资源插入进行,添加到head中生效 'style-loader', //将css文件变成commonjs模块加载js中,里面内容是样式字符串 'css-loader', //将less文件编译成css文件 //需要下载less-loader和less 'less-loader' ] }, ] }, // plugins的配置 plugins: [ // 详细的plugins配置 // 详细的plugins配置 // html-webpack-plugin // new HtmlWebpackPlugin() 功能:默认会创建一个空的HTML, 自动引入打包输出的所有资源(JS/CSS) //需求:需要有结构的HTML文件 new HtmlWebpackPlugin({ //复制../src/index.html'文件,并自动引入打包输出的所有资源(JS/CS5) template: './src/index.html' }), // 告诉webpack哪些库不参与打包,同时使用时的名称也得变~ new webpack.DllReferencePlugin({ manifest: resolve(__dirname, 'dll/manifest.json') }), // 将某个dll文件打包输出去,并在html中自动引入该资源 new AddAssetHtmlWebpackPlugin({ filepath: resolve(__dirname, 'dll/jquery.js') }) ], // 模式 development 开发环境,production 生产环境 mode: 'development', // 生产环境下会自动压缩js代码 // mode: 'production' };
核心配置
/* webpack.config.js webpack的配置文件 路径: ./webpack.config.js */ …… // 引入webpack const webpack = require('webpack'); // 引入add-asset-html-webpack-plugin const AddAssetHtmlWebpackPlugin =require('add-asset-html-webpack-plugin'); …… // plugins的配置 plugins: [ // 详细的plugins配置 // 告诉webpack哪些库不参与打包,同时使用时的名称也得变~ new webpack.DllReferencePlugin({ manifest: resolve(__dirname, 'dll/manifest.json') }), // 将某个dll文件打包输出去,并在html中自动引入该资源 new AddAssetHtmlWebpackPlugin({ filepath: resolve(__dirname, 'dll/jquery.js') }) ],
webpack.DllReferencePlugin
:独立打包的dll库,不在打包到输出的chunk中。
AddAssetHtmlWebpackPlugin
:在html中引入指定独立打包的dll库资源,并将该资源独立打包出去。
2.2、其他工程文件
<!-- ./src index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>webpack</title> </head> <body> <h1 id="title">hello dll</h1> </body> </html>
// 入口文件 // ./src/index.js import { $ } from 'jquery'; console.log($);
2.3、构建打包
> npx webpack
2.4、工程文件目录
. ├── build //构建打包生成的目录 │ ├── built.js │ ├── index.html │ └── jquery.js //独立打包,并在html中被引入的jquery库资源 ├── dll // 打包后生成的目录 │ ├── jquery.js // 根据webpack.dll.js配置独立打包出来的jquery │ └── manifest.json //映射文件 ├── src │ ├── index.html │ └── index.js // 入口文件,使用jquery包 ├── webpack.config.js └── webpack.dll.js //打包配置文件
// 入口文件 // ./src/index.js import { $ } from 'jquery'; console.log($);
<!-- 生成的 index.html 文件,./build/index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>webpack</title> </head> <body> <h1 id="title">hello dll</h1> <script src="built.js"></script> <!-- AddAssetHtmlWebpackPlugin 插件引入的资源 --> <script src="jquery.js"></script> </body> </html>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通