webpack学习笔记
一.webpack安装
全局安装:
npm install webpack webpack-cli -g
局部安装:
npm install webpack webpack-cli -d
二.webpack打包
2.1.项目目录结构
1 | webpack |
2.2.初次打包可能遇到的问题
2.2.1.问题
1 | webpack : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\webpack.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的about_Execution_Policies。 |
2.2.2.解决方案
运行powershell(管理员身份)
,输入 set-ExecutionPolicy RemoteSigned
,选:A
1 | PS C:\Users\Administrator> set-ExecutionPolicy RemoteSigned |
2.3.webpack执行原理
webpack会从当前项目的文件夹下寻找src文件夹,把src
文件夹下的index.js
当做webpack
打包的入口文件,打包完成后在当前项目下生成一个dist
的目录文件夹,该文件夹中为打包后的文件;或者指定文件去打包,例如webpack ./src/index.js ./dist/main.js
会把src
文件夹下的index.js
作为入口文件进行打包,打包之后生成一个dist
文件夹,main.js
作为打包之后的文件。(可以通过webpack.config.js
进行自定义配置入口文件和打包后的文件等配置)
2.4.打包命令
2.4.1.注意
所有的命令都是在当前项目目录下执行
2.4.2.全局命令
webpack
或者 webpack ./src/index.js ./dist/main.js
2.4.3.局部命令
先执行
npm init -y
,在当前项目下会生成一个package.json
的配置文件,该文件记录了当前项目下所需要的依赖 (如果输入npm init
,需要输入当前项目的一些基本信息)再执行
npm install webpack webpack-cli -d
,会按照package.json
文件的配置,在当前项目下进行局部的安装webpack,生成一个node_modules
的文件夹,需要执行在node_modules
文件夹下的.bin
文件夹下的webpack
(三种命令任选其一)命令1:
.\node_modules\.bin\webpack
命令2:
npx webpack
npx
会到当前目录的node_modules/.bin目录下查找对应的命令命令3:
先在
package.json
文件中,在scripts中配置一个脚本命令"scripts": {"build": "webpack"}
再执行
npm run build
三.webpack的基本配置
在当前项目下新建一个webpack.config.js
文件,对当前项目进行配置
1 | const path = require('path') //导入node_modules中的path |
package.json
1 | { |
四.loader基本使用
4.1.样式的处理
具体使用参考官方文档:Loaders | webpack 中文文档 | webpack 中文文档 | webpack 中文网 (webpackjs.com)
4.1.1.less-loader
安装命令
1 | npm install style-loader --save-dev //将模块的导出作为样式添加到 DOM 中 |
基本配置
在使用其它loader
之前需要先安装style-loader
,然后在webpack.config.js
中进行配置(例如配置less-loader
)
1 | module.exports = { |
注意:使用多个loader时,是从后往前加载(先加载less-loader
,再加载css-loader
,最后加载style-loader
)
4.1.2.PostCSS
PostCSS
是一个通过JavaScript
来转换样式的工具,可以帮助我们进行一些CSS
的转换和适配,比如自动添加浏览器前缀、css
样式的重置,我们需要借助于PostCSS
对应的插件。webpack 中文文档 | webpack 中文文档 | webpack 中文网 (webpackjs.com)
使用方式
- 查找
PostCSS
在构建工具中的扩展,比如webpack
中的postcss-loader
- 选择可以添加你需要的
PostCSS
相关的插件 (使用了postcss-preset-env
插件)
安装命令
1 | npm install postcss-loader postcss -D // 安装postcss-load |
基本配置
1 | // webpack.config.js (方式一) |
1 | // 方式二 |
4.2.资源模块处理
资源模块(asset module)是一种模块类型,它允许使用资源文件(字体,图标等)而无需配置额外 loader。(使用图片加载实例)
官方文档:webpack 中文文档 | webpack 中文文档 | webpack 中文网 (webpackjs.com)
在 webpack 5 之前,通常使用:
raw-loader
将文件导入为字符串url-loader
将文件作为 data URI 内联到 bundle 中file-loader
将文件发送到输出目录
资源模块类型(asset module type),通过添加 4 种新的模块类型,来替换所有这些 loader:
asset/resource
发送一个单独的文件并导出 URL。之前通过使用file-loader
实现。asset/inline
导出一个资源的 data URI。之前通过使用url-loader
实现。asset/source
导出资源的源代码。之前通过使用raw-loader
实现。asset
在导出一个 data URI 和发送一个单独的文件之间自动选择。之前通过使用url-loader
,并且配置资源体积限制实现。
4.2.1.webpack5之前
具体使用参考官方文档:Loaders | webpack 中文文档 | webpack 中文文档 | webpack 中文网 (webpackjs.com)
安装命令
1 | npm install --save-dev url-loader // 像file loader一样工作,但如果文件小于限制,可以返回data URL |
基本配置
在webpack.config.js
中配置
1 | module.exports = { |
4.2.2.webpack5之后
具体参考文档:webpack 中文文档 | webpack 中文文档 | webpack 中文网 (webpackjs.com)
自定义文件的输出路径和文件名
- 修改output,添加assetModuleFilename属性
- 在Rule中,添加一个generator属性,并且设置filename
最常用的placeholder
- [ext]: 处理文件的扩展名
- [name]:处理文件的名称
- [hash]:文件的内容,使用MD4的散列函数处理,生成的一个128位的hash值(32个十六进制) ([hash:6]: 取6位)
1 | const path = require('path'); |
url-loader的limit效果
开发中往往小的图片需要转换,大的图片直接使用图片
小的图片转换base64之后可以和页面一起被请求,减少不必要的请求过程;大的图片也进行转换,反而会影响页面的请求速度
- 将type修改为asset
- 添加一个parser属性,并且制定dataUrlCondition条件,添加maxSize属性
1 | rules: [ |
4.3.babel-loader
4.3.1.命令
具体使用参考官方文档:babel-loader | webpack 中文文档 | webpack 中文文档 | webpack 中文网 (webpackjs.com)
1 | //webpack 3.x | babel-loader 8.x | babel 7.x |
4.3.2.配置
1 | module.exports = { |
五.Vue的配置
5.1.Vue的安装
1 | npm install vue --save |
5.2.Vue的使用
5.2.1.vue版本问题
runtime-only
=> 代码中,不可以有任何的template
1 | import Vue from 'vue' |
runtime-compiler
=> 代码中,可以有template
,因为有compiler
可以用于编译template
1 | import Vue from 'vue' |
需要在webpack.config.js
中进行配置
1 | module.exports = { |
5.2.2.el 和 template的关系
template
会替换掉 el
1 | import Vue from 'vue' |
5.2.3.vue使用组件化的进一步简化
方式一:放在一个文件中
1 | import Vue from 'vue' |
方式二:抽离成一个单独的文件
app.js
1 | export default { |
index.js
1 | import Vue from 'vue' |
5.2.4.安装编译 .vue 文件的loader
5.2.4.1.安装
1 | npm install --save-dev vue-loader vue-template-compiler |
5.2.4.2.配置
webpack.config.js
1 | module.exports = { |
此时遇到的问题
vue-loader
的版本从14.x开始,需要再配置其它的插件
1 | ERROR in ./src/vue/App.vue |
临时解决
在package.json
文件中配置低版本的vue-loader
,然后执行npm install
1 | { |
六.plugin的使用
6.1.添加版权
webpack.config.js
1 | const webpack = require('webpack') |
打包之后在dist
文件夹下生成一个main.js.LICENSE.txt
的文件,生成的版权在文件头部出现
1 | /*! 最终版权归coderxst所有 */ |
6.2.打包index.html文件
6.2.1.安装
1 | npm install html-webpack-plugin --save-dev |
6.2.2.配置
webpack.config.js
1 | const HtmlWebpackPlugin = require('html-webpack-plugin') |
最终会在dist
文件夹下参照index.html
的模板,生成一个index.html
文件,并且会自动引入js
文件
6.3.代码丑化压缩
6.3.1.安装
目前webpack
已经集成压缩,可以不用安装UglifyJsWebpackPlugin
,安装时需要安装低版本的(@1.1.1),不然报错
1 | npm install uglifyjs-webpack-plugin --save-dev |
6.3.2.配置
webpack.config.js
1 | const UglifyJsPlugin = require('uglifyjs-webpack-plugin') |
6.4.DefinePlugin的使用
DefinePlugin允许在编译时创建配置的全局常量,是一个webpack内置的插件(不需要单独安装)
webpack.config.js
1 | const { DefinePlugin } = require('webpack') |
七.本地服务器的搭建
7.1.命令
1 | npm install webpack-dev-server --save-dev |
7.2.配置
webpack.config.js
1 | module.exports = { |
7.3.使用
方式一
直接运行node_modules
中的devServer
1 | ./node_modules/.bin/devServer |
方式二
在package.json
中配置
1 | "scripts": { |
八.webpack.config.js的分离
8.1.安装插件
1 | npm install webpack-merge --save-dev |
8.2.新建文件
在根目录下新建build
文件夹,从中新建文件base.config.js
,dev.config.js
,prod.config.js
,删除原来的webpack.config.js
文件
8.3.配置
base.config.js
1 | const path = require('path'); |
dev.config.js
1 | const webpackMerge = require('webpack-merge'); |
prod.config.js
1 | const HtmlWebpackPlugin = require('html-webpack-plugin'); |
package.json
1 | { |