网页中引用的静态资源
- JS : .js .jax .coffee .ts(TypeScript)
- CSS: .css .less .sass .scss
- Image: .jpg .png .gif .bmp .svg
- Fonts(字体文件): .svg .ttf .eot .woff .woff2
- 模板文件:.ejs .jade .vue
网页中引入的静态资源多了以后有什么问题
- 网页加载速度慢,需要发起很多二次请求
- 要处理错综复杂的依赖关系
解决方案:
- 合并、压缩、精灵图、图片的Base64编码
- 使用webpack可以解决各个包之间的复杂依赖关系
使用Gulp,基于task任务的;使用webpack,基于整个项目的构建
什么是webpack
webpack是前端的一个项目构建工具,它是基于Node.js开发出来的一个前端工具
借助webpack可以完美实现资源的合并、打包、压缩、混淆等诸多功能
1. 安装webpack:
- 安装webpack相关的包
npm i webpack@4.29.0 webpack-cli@3.2.1 -D
- 在项目根文件创建名为webpack.config.js的webpack配置文件
module.exports = {
entry: './src/main.js',
mode: 'development' // developmnet为开发阶段,production为开发阶段
}
- 在package.json配置文件中的script节点下,新增dev脚本
"script": {
"dev": "webpack" // script节点下的脚本,可以通过npm run 执行
}
- 在终端中使用npm run dev命令,启动webpack进行项目打包
2. 配置打包的入口与出口
webpack的4.x版本中默认约定:
- 打包的入口文件为src文件下的index.js文件
- 打包的输出文件为dist文件下的main.js文件
需要修改打包的入口与出口文件,可在webpack.config.js中配置
const path = require('path')
module.exports = {
// 打包的入口文件
entry: path.join(__dirname, './src/main.js'),
// 打包的输出文件
output: {
path: path.join(__dirname, './dist'), // 输出文件路径
filename: 'bundle.js' // 输出文件名称
},
// 编译模式,development为开发模式,production为上线模式
mode: 'development'
}
3. 配置webpack的自动打包功能
- 安装支持项目自动打包的工具
npm install webpack-dev-server -D
- 修改package.json的script节点中的dev
"script": {
"dev": "webpack-dev-server"
}
- 将src下的index.html文件中的script脚本的引用路径修改为“/bundle.js”
4. 配置html-webpack-plugin生成预览页面:
- 安装生成预览页面的插件
npm install html-webpack-plugin@3.2.0 -D
- 修改webpack.config.js文件,配置如下信息
const HtmlWebpackPlugin = require('html-webpack-plugin')
const htmlPlugin = new HtmlWebpackPlugin({
template: './src/index.html' // 指定要用到的模板文件
filename: 'index.html' // 指定生成的文件名称,该文件存在于内存中,在目录中不显示
})
- 修改webpack.config.js中向外暴露的对象,新增plugins配置节点
module.exports = {
plugins: [ htmlPlugin ] // plugins数组是webpack打包期间会用到的一些插件列表
}
5. 配置自动打包的相关参数
在package.json中配置
// --open 打包完成后自动打开浏览器页面
// --host 配置IP地址
// --port配置端口号
"script": {
"dev": "webpack-dev-server --open --host 127.0.0.1 --port 8888"
}
webpack中的加载器
1.通过loader打包非js文件
webpack默认只能打包处理以.js后缀名结尾的模块,其他非.js结尾的文件需要调用loader加载器才可以正常打包
- less-loader 可以打包处理 .less文件
- sass-loader 可以打包处理 .scss文件
- url-loader 可以打包处理 css 与 url 路径相关的文件
loader的调用过程
- 将要被webpack打包处理的文件是否为js模块,
- 1.1 如果包含了js文件且不包含高级js语法,直接使用webpsck处理
- 1.2 如果包含了js文件且包含高级js语法,判断是否配置了babel,配置类babel就调用loader处理,否则报错;
- 2.1 不是js模块,判断是否配置了对应的loader,配置了对应的loader就调用loader处理,否则报错。
2. 打包处理css文件
- 安装处理css文件的loader
npm i style-loader css-loader -D
- 在webpack.config.js文件的module的rules数组,添加loader规则
// 所有第三方模块的匹配规则
module: {
rules: [
// test表示匹配的文件类型, use表示对用要调用的loader
{ test: /\.css$/, use: ['style-loader', 'css-loader']}
]
}
注意: use数组中指定的loader顺序是固定的;多个loader的调用顺序是从后往前
3. 打包处理less文件
- 安装处理less的loader
npm i less-loader@4.1.0 less -D
- 在webpack.config.js的module的rules中添加loader
module: {
rules: [
// test:匹配的文件名,use对用要调用的loader
{ test: /\.css$/, use: ['style-loader', 'css-loader', 'less-loader']}
]
}
4. 打包处理scss文件
- 安装处理scss的loader
npm i sass-loader@7.x sass -D
- 在webpack.config.js的module的rules中添加loader
module: {
rules: [
// test:匹配的文件名,use对用要调用的loader
{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader']}
]
}
5. 配置postCSSzidong 添加css的兼容前缀
浏览器不兼容
- 安装loader
npm i postcss-loader autoprefixer -D
- 在项目根目录创建postcss的配置文件postcss.config.js
const autoprefixer = require('autoprefixer')
module.exports = {
plugins: [ autoprfixer ]
}
- 在webpaxk.config.js的module中修改css的loader规则
// 所有第三方模块的匹配规则
module: {
rules: [
// test表示匹配的文件类型, use表示对用要调用的loader
{ test: /\.css$/, use: ['style-loader', 'css-loader', 'postcss-loader']}
]
}
打包样式中的图片和字体文件
- 安装loader
npm i url-loader file-loader -D
- 在webpaxk.config.js的module中rules数组添加loader规则
// 所有第三方模块的匹配规则
module: {
rules: [
// test表示匹配的文件类型, use表示对用要调用的loader
{ test: /\.jpg|png|gif|bmp|ttf|eot|svg|woff|woff2$/, use: 'url-loader?limit=549941'}
]
}
其中?之后是loader的参数项,limit用来指定图片的大小,单位byte,只有小于limit大小的图片才会被转为base64图片
7. 打包处理js文件中的高级语法
- 安装babel相关的包
npm i babel-loader @babel/core/ @babel/runtime -D
- 安装babel语法插件相关的包
npm i @bable/preset-env @babel/plugin-transform-runtime @babel/plugin-proposal-class-properties -d
- 在项目根目录创建babel.config.js文件
module.exports = {
presets: ['@babel/preset-env'],
plugins: ['@babel/plugin-transform-runtime', '@babel/plugin-proposal-class-properties']
}
- 在webpack.config.js的module中rules数组中添加loader规则
module: {
rules: [
// test表示匹配的文件类型, use表示对用要调用的loader
{ test: /\.js$/, use: 'babel-loader', exclude: /node_modules/}
]
}