一、webpack简介

  webpack 是当下十分流行的一款静态模块打包工具,将JS、CSS、HTML、图片等各种静态资源视为一个个模块,通过一个或者多个入口文件通过解析依赖关系生成一个依赖图,最终打包成一个或者多个bundles,webpack本身只能打包JS文件,但是通过配置的loader和plugin可以打包Css和Html等其他格式的文件,本文基于webpack5为基础的,其中webpack4前后版本区别很大,使用时需要注意区别版本。

  webpack和glup、grunt的区别:webpack可以说是一种模块化解决方案,内嵌服务支持项目独立开发,同时可以打包单页面、多页面和提取公共模块以及处理图片文件。只打包被引用的文件,同时搭配强大的loader和plugin支持打包不同类型的语言,傻瓜式配置即可使用;grunt和glup则是基于任务式的打包工具,主要是用于编译CSS和JS,主要是用来合并、压缩和拷贝文件,不支持模块化打包。

二、配置详解

  常用配置概览

module.exports = {
 // 模式,webpack针对不同模式设置内部优化项,设置后会自动调起优化项
 mode: 'development',
// 入口 可以配置为相对路径或者绝对路径
entry: './src/index.js', // 输出文件名称和路径,
// path.reslove()返回一个绝对路径,__dirname当前文件的文件夹绝对路径
output: {
path: path.resolve(__dirname, 'dist'),
// 打包输出文件名
filename: 'main.js',
// chunkFilename 指未被列在 entry 中,却又需要被打包出来的 chunk 文件的名称。一般来说,这个 chunk 文件指的就是要懒加载的代码
chunkFilename: '[id].js',
// 下次打包时将上次打包目录下的资源清空
clean: true
},
// 加载器
module: {
rules: [],
},
// 插件
pulgins: [],
// 模式
mode: 'development',
//
devtool: '',
// 设置webpack如何解析模块,如别名、扩展名等
resolve: {
// 模块的后缀名,引入这些模块时不需要写扩展名,自动补充扩展名
extensions: ['.js', '.json', '.css']
},
// 本地服务配置
devServer: {
// 指定端口
port: 8000,
// 是否开启模块热交换功能
hot: true,
// 是否自动在浏览器打开网页
open: true
},
// 打包时排除编译该文件
externals: {
jquery: 'JQuery'
},
// 打包代码优化,进行公共代码提取,代码压缩,去除冗余代码等功能
optimization: {
splitChunks: {
chunks: 'all',
// 打包文件大于30kb时会被分割
minSize: 30 * 1024,
// 最大没有限制
maxSize: 0,
// 要提取的chunk最少被引用1次
minChunks: 1,
cacheGroups: {
// node_modules下的文件会被打包到wendors中
vendors: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
// 优先级
priority: -10
},
// 提取公共组件
commons: {
name: 'chunk-commons',
test: resolve('src/components'),
minChunks: 3,
priority:10
}
}
}
}
}

  

  1. entry:打包入口,webpack打包从此处开始,通过解析依赖加载来构建依赖关系图,包含格式有包含格式有:string | [string] | object { <key>: string | [string] } | (function: () => string | [string] | object { <key>: string | [string] }),可以配置:

// 单入口单模块
entry: './index.js', // 多入口单模块(多个入口一个出口)
entry: ['./src/Component1/main.js', './src/Component2/main.js'], // 多入口
entry:{ com1: './src/Component1/main.js', './src/Component1/main.js' }, // 接受通过函数方式返回配置
entry: glob.sync('./src/**/main.js').reduce((acc, path) => {
  const entry = path.substring(path.indexOf('/src/') + 5, path.lastIndexOf('/main.js'));
  acc[entry] = path; return acc;
}, {}),

  2. output:打包文件输出配置,支持设置entry对应的name、id、hash、contenthash,需要注意filename和chunkFilename的区别

filename: "[name].[id].[contenthash].[hash:7].js",

  3. mode:模式,内嵌development和production以及none三种模式,针对开发和生产两种场景内置不同的优化项,比如压缩、去除冗余代码等

  4. module:模块化配置,由于webpack只能解析JS,所以针对CSS、TS、SASS等无法解析的类型需要通过配置不同的loader进行处理编译。

    4.1 style-loader: 将编译完成的CSS样式挂载到style标签上,实际使用中一般放在第一位,因为loader都是从右到左,从下往上执行

// 解析CSS
rules: [{
test: /\.css/,
use: ['style-loader']
}]

    4.2 css-loader:识别.css文件,处理CSS一般需要配合style-loader使用,否则样式不会生效,或者安装MiniCssExtractPlugin将文件单独打包

rules: [{
test: /\.css$/,
// use: ['style-loader', 'css-loader'],
use: [MiniCssExtractPlugin.loader, 'css-loader'],
// 可以排除对应文件夹的内容按照该rule进行打包
exclude: /node_modules/
}]

    4.3  sass-loader处理.sass类型样式文件、postcss-loader用于补充CSS样式在各个浏览器内核的前缀,不需要手动写

// 打包SASS
rules: [{
test: /\.scss$/,
use: [
'style-loader', 'css-loader', 'sass-loader', 'postcss-loader',
],
include: '/sc/'
}]

    4.4 bable-loader: 将ES6+语法转换为ES5语法。需要配合@bable/core 和bable/preset-env来使用

// 打包JS
rules: [{
test: /\.js$/,
use: {
loader: 'bable-loader',
options: {
presets: [[ 'bable/preset-env', { targets: 'defaults' } ]]
}
}
}]

    4.5 html-loader:将 HTML 导出为字符串。当编译器需要时,将压缩 HTML 字符串。

    4.6 file-loader:处理文件资源,比如jpg、png等图片

// 处理图片资源
rules: [{
test: /\.(png|jpg|jpeg)$/,
use:[
{
loader: 'file-loader',
options: {
name: '[name]_[hash:8].[ext]'
}
}
]
}]

    4.7 url-loader:同样是处理图片资源,与file-loader不同的是可以根据tip的大小决定是否将图片生成Base64保存到JS文件里,方便快速加载

// 处理图片资源
rules: [{
test: /\.(png|jpg|jpeg)$/,
use:[
{
loader: 'url-loader',
options: {
name: '[name]_[hash:8].[ext]',
     // 当小于10kb时转换为base64打包到JS当中,否则保存为图片
     limit: 10240
}
}
]
}]

    4.8 其余还有vue-loader 加载和解析vue文件;eslint-loader 通过eslint检查JS代码;i18n-loader 加载多语言版本,支持国际化。

    注:官方loader查看地址  https://webpack.js.org/loaders/

5. plugins: 插件,和loader一样是webpack的支柱功能,主要解决loader无法解决的问题,需要使用某个插件时,首先需要安装,其次引入文件到本地中,最后才能使用

    5.1 clean-webpack-plugin:打包前清理dist目录下的内容,避免再次打包时文件覆盖,之前的老文件遗留下来

    5.2 copy-webpack-plugin:拷贝某个目录下的文件到dist下的某个目录,

new CopyWebpackPlugin([
// 将src目录下的内容拷贝到dist/common下
{ from: './src', to: './common' }
])

    5.3 html-webpack-plugin:生成html文件,以及自动引入打包好的css文件和JS文件(由于打包后的JS和CSS为了避免缓存都会动态生成文件名,所以每次打包手动引入比较麻烦)

// 单页面打包
new HtmlWebpackPlugin({ template: './index.html' }), // 多页面打包
entry: {
com1: './src/Component1/main.js',
com2: './src/Component2/main.js'
}, plugins: [
new HtmlWebpackPlugin({
// 使用模板
template: path.join(__dirname, 'src/component1/index.html'),
// 打包后的文件名
filename: 'com1.html',
// 和入口文件的key值相对应
chunks: ['com1']
}),
new HtmlWebpackPlugin({
template: path.join(__dirname, 'src/component2/index.html'),
filename: 'com2.html',
chunks: ['com2']
})
],

  

    5.4  mini-css-extract-plugin:打包好的样式一般通过style-loader会插入大页面中,但是如果想要实现CSS分离生成单独的文件,可以通过这个组件实现,但是需要配合前文中的loader使用

rules: [{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css-loader']
}], plugins: [
new HtmlWebpackPlugin({ template: './index.html' }),
new MiniCssExtractPlugin({
filename: 'css/[name].css'
})
],

    5.5 自定义组件AddAuthorPlugin开发和使用:

// 在plugin文件夹下新增一个add-author-plugin.js文件
// 其中apply是内置方法
class AddAuthorPlugin {
constructor(options = {}) {
this.author = options.author;
this.date = options.date;
}
apply(compiler) {
compiler.hooks.compile.tap('AddAuthorPlugin', (compilation, callback) => {
  console.log('***');
})
}
} module.exports = AddAuthorPlugin;

// 使用的时候
const AddAuthorPlugin = require('./plugin/add-author-plugin');

new AddAuthorPlugin({ author: '张三', date: new Date() });

  打包时如何调测自定义组件:

  首先执行命令 node --inspect-brk .\node_modules\webpack-cli\bin\cli.js,然后在chrome浏览器中输入 chrome://inspect/#devices 回车后,点击 Open dedicated DevTools for Node 就可以进入调测模式,为了方便打断点,可以现在代码中设置debugger。详细步骤看录屏

    注:官方plugin查看地址 https://webpack.js.org/plugins/

  6. devtool:已不同的方式打包文件,配置项总共有十几种,为了区分开发环境和生产环境,主要介绍下面几种

    6.1 开发环境推荐使用:

    eval:每个模块都使用eval执行,速度非常快,但是不会显示正确的行号,所以没法进行调试

    eval-source-map:,每个模式使用eval()执行,起初是缓慢的,但是重建的速度较快而且产生真是的文件,行号也被正确映射,产生的开发资源也是最优的。

    cheap-eval-source-map:每个模块也是经过eval执行,但是只映射了行号没有列,只显示与eval类似的被转换的代码。

    6.2 生产环境推荐使用:

    none:不触发sourcemap,性能最佳

    source-map:会生成一个完整的sourceMap作为一个单独的文件,为bundle添加了引用注释,因此开发工作知道如何找到它。

    hidden-source-map:与source-map类似,但不添加引用注释。

  7. devServer:方便前后端分离开发,一个本地服务

  8. optimization:打包优化,可以实现提取公共代码,代码压缩以及去除冗余代码等功能

三、常见问题

  1. chunk和bundle的概念:chunk是一个代码块,在构建的时候会根据入口文件和依赖关系生成多个chunk,bundle是指最后生成的文件,包含所有的chunk和模块

  2. vue中的webpack是如何使用的:当前通过vue-cli脚手架创建的Vue项目都内置了webpack的打包功能,基本不需要独立配置即可使用,如果更改配置项则需要在vue.config.js中配置

// 两种方式自定义webpack配置
configureWebpack: {
rules: [],
plugins: []
}, configureWebpack: (config) => {
config.devtool = 'source-map';
config.plugins.push(***);
}

  3. webpack的优缺点和其他组件(Vite)的对比:

    优点:模块化打包、零配置

    缺点:随着项目变大,模块化增多,启动时会逐渐变慢,热更新也会变慢

    Vite:由于打包原理和底层开发使用的语言不同,总体Vite打包和启动都要比webpack快很多,但是Vite生态不完善。

webpack4.0+简要的更多相关文章

  1. webpack4.0各个击破(9)—— karma篇

    webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高.本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决方式的模式,以前端构建中遇到的具体需求为出发点,学习we ...

  2. 史上最走心webpack4.0中级教程——配置之外你应该知道的事

    <webpack4.0各个击破系列>适合不满足于只会配置webpack但一时间又看不懂源码的中级读者.我没法保证这个系列是最好的,但至少能保证每一篇博文都跟那些Ctrl+C和Ctrl+V的 ...

  3. webpack4.0各个击破(1)—— html部分

    webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高.本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决方式的模式,以前端构建中遇到的具体需求为出发点,学习we ...

  4. webpack4.0各个击破(2)—— CSS篇

    webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高.本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决方式的模式,以前端构建中遇到的具体需求为出发点,学习we ...

  5. webpack4.0各个击破(3)—— Assets篇

    目录 一. Assets资源的基本处理需求 二. webpack处理引用资源 2.1 资源打标 2.2 引用优化 2.3 sprites雪碧图合成 2.4 图片压缩及其他 webpack作为前端最火的 ...

  6. webpack4.0各个击破(4)—— Javascript & splitChunk

    目录 一. Js模块化开发 二. Js文件的一般打包需求 三. 使用webpack处理js文件 3.1 使用babel转换ES6+语法 3.2 脚本合并 3.3 公共模块识别 3.4 代码分割 3.5 ...

  7. webpack4.0各个击破(5)—— Module篇

    webpack4.0各个击破(5)-- Module篇 webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高.本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决 ...

  8. webpack4.0各个击破(6)—— Loader篇

    webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高.本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决方式的模式,以前端构建中遇到的具体需求为出发点,学习we ...

  9. webpack4.0各个击破(7)—— plugin篇

    webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高.本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决方式的模式,以前端构建中遇到的具体需求为出发点,学习we ...

  10. webpack4.0各个击破(8)—— tapable篇

    webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高.本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决方式的模式,以前端构建中遇到的具体需求为出发点,学习we ...

随机推荐

  1. [QOJ4815] Flower's Land

    简要题意:给出一个 \(n\) 个点的树,对某个点 \(i\) 求包含某一个点的大小为 \(k\) 的权值最大的连通块,一个连通块的权值是其所有点的权值之和. \(n\le 40000,k\le \m ...

  2. Vue2.0 学习 第二组 语法模板

    本笔记主要参考菜鸟教程和官方文档编写. 1.文本绑定 一般在dom中用{{}}标时,并且在vue构造体内的data中定义文本内容 <div id="app">    & ...

  3. 解决OpenCV3+VS2015(VS2017)运行时出现debug error abort()has been called的问题

    问题描述: 在windows平台上安装opencv后,测试一张图片时,出现了debug error abort()has been called的问题 环境: vs2015 windows 10 op ...

  4. MySQL运维10-Mycat分库分表之一致性哈希分片

    一.一致性哈希分片 一致性哈希分片的实现思路和我们之前介绍的水平分表中的取模分片是类似的.只不过取模分片,采用的是利用主键和分片数进行取模运算,然后根据取模后的结果,将数据写入到不同的分片数据中.但是 ...

  5. Git和Github库详细使用教程

    SVN 是集中式或者有中心式版本控制系统,版本库是集中放在中央服务器的; Git 是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为 ...

  6. influxdb 进行数据删除和修改

    本文为博主原创,转载请注明出处: 1.条件删除数据 InfluxDB 只支持基于时间的删除操作. 可以使用 DELETE 语句来删除指定时间范围内的数据.例如,以下的 SQL 语句将删除 measur ...

  7. Python压缩JS文件,重点是 slimit

    摘要:Python Web程序员必看系列,学习如何压缩 JS 代码. 本文分享自华为云社区<Python压缩JS文件,PythonWeb程序员必看系列,重点是 slimit>,作者: 梦想 ...

  8. 一文读懂GaussDB(openGauss) 的六大关键技术特性

    摘要:更为深入地介绍了GaussDB(openGauss)的关键特性.成功案例. GaussDB(openGauss)是深度融合华为在数据库领域多年的经验,结合企业级场景需求,推出的新一代企业级分布式 ...

  9. 一通百通,带你一次性全理解Spring 中的Template

    摘要:Template定义了问题的边界,子类定义了具体的实现,只要在模板的范围内玩耍就可以了. 本文分享自华为云社区<Spring 中的Template一次全理解,解析问题的本质>,作者: ...

  10. Git hooks与自动化部署

    好的 commit message 是至关重要的,如果随意编写 log,带来的后果可小可大,但是无论大小都影响了开发的效率和回朔的难度,所以有必要进行 log 规范化检查. 通过自定义的commit ...