文章目录
Webpack的基本使用
nrm的安装(环境)
- 可以在有
node.js
环境的命令行中运行npm install nrm -g
进行全局安装 - 安装成功后可以使用
nrm ls
命令查看镜像地址列表 - 使用
nrm use 镜像地址的名称
命令切换使用的镜像地址,例如:nrm use taobao
nrm
只是提供了下载包的地址,并能在地址之间切换,但安装包的工具依旧是npm
nrm
中的cnpm
只是地址,而npm install cnpm -g
安装命令之后运行的cnpm install jquery -g
命令中的cnpm
是一个安装包的工具
- 使用
npm list -g --depth 0
可查看全局安装的模块,使用npm ls
可查看局部安装的模块
Webpack的认识
- 网页中的常见静态资源:
js(.js、.jsx、.coffee、.ts(TypeScript))
css(.css、.less、.sass( => .scss))
Images(.jpg、.png、.gif、.bmp、.svg)
fonts(.svg、.ttf、.eot、.woff、.woff2)
模板文件(.ejs、.jade、.vue)
- 网页加载慢,可能是因为网页发起二次请求,去请求各种静态资源
- 解决二次请求以及资源间的依赖关系
- 合并(减少请求)、压缩(提高速度)、精灵图、
base64
编码图片 - 使用
Webpack
可解决资源的依赖
- 合并(减少请求)、压缩(提高速度)、精灵图、
Webpack
是前端的项目构建工具,基于node.js
开发的工具- 可以使用
npm install webpack -g
命令进行全局安装webpack
- 也可以使用
npm install webpack --save-dev
命令进行局部安装
- 也可以使用
项目目录
- 使用
webpack
构建的项目目录:/src
文件夹 : 存放源码/src/css
文件夹 : 存放css
源码文件/src/js
文件夹 : 存放js
源码文件/src/images
文件夹 : 存放images
源码文件index.html
: 网页文件index.js
: 项目的js
入口文件
/dist
文件夹 : 存放编译打包发布的文件/package.json
: 使用npm init [-y]
命令初始化项目时用于存放项目信息的文件/node_modules
: 存放通过npm
工具下载的依赖包
- 不直接在页面中引用
js
源码文件,因为js
源码文件可能使用了ES6
的语法,导致浏览器解析失败 - 不直接在页面中引用依赖的文件,避免二次请求和依赖复杂
- 可以在
js
的入口源码文件中引用所依赖的文件,再经编译打包发布后,页面再引用- 在
js
入口源码文件的中的开始位置使用import 别名 from '依赖的包名';
语句进行依赖的引入import 别名 from '模块名';
是ES6
中导入模块的方法
- 在
使用Webpack
- 使用
webpack 源码文件 打包文件
进行打包并编译发布到打包文件的目录中- 若有错误,可能版本不同,最新版本使用时在源码文件和打包文件之间加上
-o
即可
- 若有错误,可能版本不同,最新版本使用时在源码文件和打包文件之间加上
- 可以将打包相关信息存放在一个配置文件中
- 在项目根目录下创建一个名为
webpack.config.js
的配置文件 - 在配置文件中通过使用
module.exports = {}
向外导出配置一个配置对象 - 配置对象中使用
entry
属性表示webpack
要打包的文件 - 配置对象中使用
output
属性表示webpack
要打包发布的文件信息对象- 该对象的
path
属性表示发布的目录路径 - 该对象的
filename
属性表示发布的文件名称
- 该对象的
- 通过配置文件方式打包时,可以直接运行
webpack
命令
例如:
- 在项目根目录下创建一个名为
const path = require('path')
module.exports = {
entry: path.join(__dirname,'./src/index.js'),
output: {
path: path.join(__dirname,'./dist'),
filename: 'bundle.js'
}
}
webpack插件
webpack-dev-server
webpack-dev-server
是一个用于自动编译打包的工具- 使用
npm install webpack-dev-server -D
命令将工具安装到项目本地开发依赖 - 由于是本地安装,故此无法将其当作脚本命令直接使用(全局安装的则可以)
- 可以将其配置在
pakeage.json
的script
中 - 可以带参数
--open
,即自动编译打包后直接打开浏览器 - 还可以带参数
--port 端口号
指定打开浏览器后访问的端口 - 还可以带参数
--contentBase 文件目录
指定打开浏览器后访问的文件的目录 - 若带参数运行则可不进行配置插件
例如:webpack-dev-server --open --port 3000 --contentBase src
- 可以将其配置在
- 运行该工具时必须本地安装
webpack
- 该工具将入口
js
脚本打包到内存中
html-webpack-plugin
- 使用
cnpm install html-webpack-plugin -D
或npm install html-webpack-plugin -D
进行本地安装 - 将安装到本地的
html-webpack-plugin
包导入到webpack.config.js
配置文件中 - 该插件会将页面拷贝到内存中,并自动导入打包到内存的
js
脚本
配置插件
- 可以在
webpack.config.js
配置文件导出的配置对象中使用plugins
属性指定一个插件配置的数组 - 使用
new htmlWebpackPlugins()
构造函数构造一个插件对象并放入插件配置的数组中 - 使用
new htmlWebpackPlugins()
构造函数时传入一个配置对象- 配置对象中的
template
属性用于指定页面的模板文件路径 - 配置对象中的
filename
属性用于指定生成到内存的页面文件名
- 配置对象中的
导入样式
- 在
js
的入口文件中使用import 文件路径
即可向其中导入文件- 通过路径的形式引入
node_modules
中的文件,则可省略路径前面的node_modules
目录,直接使用包名后跟路径 - 路径中没有,默认在
node_modules
目录中查找
- 通过路径的形式引入
webpack
默认只能打包处理js
类型文件,无法处理非js
类型的文件- 如果处理非
js
类型文件,需要手动安装合适的第三方loader
加载器- 打包处理
css
文件,需使用cnpm install style-loader css-loader -D
命令安装相应的loader
- 在
webpack.config.js
配置文件中新增配置节点module
,该节点对应一个对象module
对象有rules
属性表示所有的第三方文件匹配及处理规则的数组- 每个匹配规则即为一个对象,对象中有一个
test
属用于指定匹配的正则表达式 - 对象中的
use
属性用于指定处理的loader
- 在调用
loader
时是从后向前调用的 - 最后一个
loader
调用完会将处理结果直接交给webpack
进行打包合并
- 在调用
css
文件对应style-loader
、css-loader
less
文件对应less-loader
,但less-loader
依赖less
scss
文件对应sass-loader
,但sass-loader
依赖sass
、node-sass
、fibers
scss
文件对应sass-loader
,但sass-loader
依赖sass
、node-sass
、fibers
webpack
默认无法处理css
文件中的url
地址(包括图片、字体库路径)- 使用
url-loader
即可处理,但url-loader
依赖file-loader
loader
可以通过url
形式传参- 在
url-loader
后通过?
传参,参数limit
对应的参数值为图片进行base64
编码的阈值- 当图片的大小(单位:字节
byte
)不超过阈值时,则进行base64
编码 - 当图片的大小(单位:字节
byte
)超过阈值时,则不进行base64
编码,并重命名- 此处重命名是由于所有图片都被托管到根路径,需避免不同目录中的同名文件在根路径下的重名
- 当图片的大小(单位:字节
- 为避免图片重名,可以使用
name
参数设置重命名- 传入的
[name]
表示原文件名 - 传入的
[ext]
表示文件的扩展名 - 传入的
[hash: [int] ]
表示原文件唯一的标识,其中的[int]
表示hash
值的位数
- 传入的
- 使用
- 若导入诸如
BootStrap
等前端框架,则其中可能存在字体文件- 字体文件的扩展名有:
.eot
、.svg
、.ttf
、woff
、woff2
- 字体文件的
loader
也是url-loader
- 字体文件的扩展名有:
- 所有
loader
以及其所依赖都需使用npm install 包名 -D
或cnpm install 包名 -D
命令下载
webpack.config.js
示例如下:
- 打包处理
const path = require('path')
const htmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
entry: path.join(__dirname,'./src/index.js'),
output: {
path: path.join(__dirname,'./dist'),
filename: 'bundle.js'
},
plugins: [
new htmlWebpackPlugin({
template: path.join(__dirname,'./src/index.html'),
filename: "index.html"
})
],
module: {
rules: [
{test: /\.css$/, use: ['style-loader','css-loader']},
{test: /\.less$/, use: ['style-loader','css-loader','less-loader']},
{test: /\.scss$/, use: ['style-loader','css-loader','sass-loader']},
{test: /\.(jpg|png|gif|bmp|jpeg)$/, use: ['url-loader?limit=2739&name=./images/[hash:8]-[name].[ext]']}
]
}
}
Babel处理部分高级语法
在
webpack
中默认只能处理一部分ES6
新语法,有一部分处理不了
在webpack
中处理不了的语法,需借助第三方loader
处理
- 在
webpack
中可以运行两套命令,安装两套包(包含Babel
相关loader
)- 第一套:运行
cnpm install @babel/core babel-loader @babel/plugin-transform-runtime -D
- 第二套:运行
cnpm install @babel/preset-env @babel/plugin-proposal-function-bind @babel/plugin-proposal-class-properties -D
- 第一套:运行
- 在
webpack.config.js
配置文件的配置节点module
中的处理规则rules
数组中添加一个新的匹配规则- 需处理的
ES6
语法放于js
文件中,故此新的匹配规则的test
属性应使用正则表达式匹配js
文件 - 由于
node_modules
目录中存在大量的js
文件,并且这些js
文件可能已经痛过了编译打包 - 对于已经编译打包的
js
文件就没必要再通过webpack
进行编译打包- 可以在新的匹配规则对象中使用
exclude
属性指定排除的路径
- 可以在新的匹配规则对象中使用
- 需处理的
- 在根目录中新建一个
.babelrc
的Babel
配置文件,该配置文件属于JSON
格式(无注释,字符串必须双引)
例如:
{
"presets" : ["@babel/preset-env"],
"plugins" : ["@babel/plugin-transform-runtime","@babel/plugin-proposal-function-bind","@babel/plugin-proposal-class-properties"]
}
异常和错误
- 在
.json
文件中不能有注释 - 若遇到问题或因网络问题下载缓慢可以将
node_modules
文件夹删除,然后重新通过npm install
命令进行安装