一、前端工程化的四个方面
1、模块化
(JS的模块化,CSS模块化,其他资源的模块化)
2、组件化
(复用现有的UI结构,样式,行为)
3、规范化
(目录结构的划分,编码规范化,接口规范化,文档规范化,git分支管理)
4、自动化
(自动化构建,自动部署,自动化测试)
二、webpack的基本使用
- 主要功能,提供友好的模块化支持,代码压缩,以及处理浏览器之间的js兼容性
2、1 webpack的安装和配置
npm i webpack@5.5.1 webpack-cli@4.2.0 -d (开发时依赖) -s (运行时依赖)
2、1、1 配置webpack
-
在根目录中创建webpack.config.js 的webpack配置文件 并初始化如下配置 module.exports = {
mode: 'development'
}
-
在package。json 的script 脚本中加一个dev script:{
"dev":"webpack",
"build":""
}
然后执行 npm run dev 去webpack.config.js 里根据里面配置的内容进行打包
再自动找到./src下的index.js 文件根据里面的文件进行各种处理
- 默认打包入口为src - > index.js
- 默认输出文件路径 dist - > main.js
2、2、2 自定义入口和出口
const path = require("path")
module.exports = {
mode:"development",
entry:path.join(__dirname,"./src/index.js"),
output:{
path:path.join(__dirname,"./dist"),
filename:"bundle.js"
}
}
2、2、3配置自动打包
安装webpack -dev-server 可以使我们每次更改保存后自动帮我们打包
npm i webpack-dev-server@3.11.0 -d
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack serve"
},
配置dev-server 后 会将打包的内容放进根目录的内存里,是虚拟的,看不见的,再直接访问dist/下的打包文件会看不到实时效果
直接使用/bundle.js 代表访问根目录下的打包文件
<script src="/bundle.js"></script>
配置devServer 的需求选项 可以在自动打包完后自动打开网页,并根据你的需求开启对应的主机端口
module.exports = {
devServer:{
open:true,
host:"127.0.0.1",
port:80
}
}
2、3、4配置html插件
- html-webpack-plugin 可以帮助我们将src的index.html 复制一份到项目的根目录中,方便我们直接通过localhost直接访问主页
安装插件
npm i html-webpack-plugin -d
配置插件
const HtmlPlugin = require('html-webpack-plugin')
const htmlPlugin = new HtmlPlugin({
template:'./src/index.html',
filename:'./index.html'
})
module.exports = {
mode:"development",
plugins:[htmlPlugin]
}
注意:
- 复制出来的首页也是放在了内存中,
- 且会自动帮打包好的bundle.js 自动放进index.html 的底部
- 直接访问localhost:8080 即可直接看到页面
2、2 webpack 中的loader
- webpack默认只能打包。js后缀名的模块,如果需要处理其他的模块,则需要loader加载才可以正常打包
- css-loader 可以处理.css 相关的文件
- less-loader 可以处理.less 相关的文件
- babel-loader 可以打包处理webpack无法处理的高级JS语法
2.2.1 配置css-loader
安装插件
npm i style-loader@2.0.0 css-loader@5.0.1 -d
配置css-loader , style-loader
module:{
rules:[
{test:/\.css$/,use:['style-loader','css-loader']}
]
}
loader 的顺序都是从右到左,从下到上,先css处理完css文件后,再用style渲染到index中
2.2.2配置less-loader
安装插件 除了安装less-loader 还需要安装less
npm i less-loader@7.1.0 less@3.12.2 -d
配置less-loader
module:{
rules:[
{test:/\.css$/,use:['style-loader','css-loader']},
{test:/\.less$/,use:['style-loader','css-loader','less-loader']}
]
}
2.2.3配置打包样式表的url文件
安装插件
npm i url-loader@4.1.1 file-loader@6.2.0 -d
配置loader
module:{
rules:[
{test:/\.css$/,use:['style-loader','css-loader']},
{test:/\.less$/,use:['style-loader','css-loader','less-loader']},
{test:/\.jpg|png|gif$/,use:'url-loader?limit=22229'}
]
}
注意:
- ?limit=22229 是loader的参数项
- limit用来指定图片的大小,单位是字节
- 只有<= limit 大小的图片,才会被转为base64格式的图片 即安装的file-loader的功能
配置loader的另一种方式
module:{
rules:[
{test:/\.jpg|png|gif$/,use:{
loader:'url-loader',
options:{limit:22229}
}}
]
}
2.3.4配置babel-loader
webpack 只能打包处理一部分高级语法,对于无法处理的高级语法则需要借助babel-loader进行打包处理
class Person{
static info = "person info"
}
console.log(Person.info)
安装babel-loader 相关的包
npm i babel-loader@8.2.1 @babel/core@7.12.3 @babel/plugin-proposal-class-properties@7.12.1 -d
配置babel-loader
module:{
rules:[
{test:/\.js$/,
exclude:'/node_modules/',
use:{loader:'babel-loader',
options:{
plugins:['@babel/plugin-proposal-class-properties']
}}
}]
}
2、3 webpack 打包发布
2.3.1 相关配置
先到webpack.config.js 中配置build脚本,然后运行npm run build 即可
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack serve",
"build":"webpack --mode production"
},
但是这样直接运行的会在dist下打包一堆的文件
想解决这样的问题即可在webpack.config.js 中配置文件的output 节点
output:{
path:path.join(__dirname,"./dist"),
filename:"js/bundle.js"
}
然后我们再给img文件也配置一个路径
{test:/\.jpg|png|gif$/,use:{
loader:'url-loader',
options:{limit:22229,outputPath:'image'}
}}
打包完的结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i5d9SufM-1642952443423)(…/…/…/AppData/Roaming/Typora/typora-user-images/image-20220123222014858.png)]
2.3.2 自动清理dist
为了每次打包发布时自动清理dist目录下的文件(避免旧的文件会保留),可以安装clean-webpack-plugin 插件
npm i clean-webpack-plugin@3.0.0 -d
插件的配置
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
const cleanPlugin = new CleanWebpackPlugin()
plugins:[htmlPlugin,cleanPlugin],
这样即使在dist中有其他无关的文件,也会在每次打包前把它清空掉,从而不会影响发布的文件体积
2.3.3 企业级的打包
一般会多很多优化的方案例如:
- 生成打包报告,根据报告分析具体的优化方案(使用vue -ui)
- Tree-Shaking
- 为第三方库启用CDN加载
- 配置组件的按需加载
- 开启路由懒加载
- 自定制首页内容
2、4 Source Map
- source map 是一个信息文件,里面存储着代码压缩前后的位置信息。
- 即可以在Debug时直接显示原始代码的位置信息,而不是压缩后的,极大方便后期调试
2.4.1 默认source map 的问题
开发环境下默认生成的Source Map ,记录的是生成后的代码的位置。会导致运行时报错的行数与源代码的行数不一致的问题如图:
2.4.2 解决默认 Source Map 的问题
开发环境下,推荐在webpack.config.js中添加如下配置,即可保证运行时报错的行数与源代码的行数保持一致
module.exports = {
mode:"development",
devtool:'eval-source-map',
}
2.4.3 生产环境下的 Source Map
在生产环境下,如果只想定位报错的具体行数,且不想暴漏源码,
此时可以将devtool的值配置为 nosources-source-map 具体效果如图:
2.4.4 Source Map 的最佳实践
1、开发模式下:
- 建议直接把devtool 的值设置为eval-source-map
- 好处:可以直接定位到具体的错误行
2、生产环境下:
- 建议关闭Source Map 或者 将devtool 设置为 nosources-source-map
- 好处:防止源码泄漏,提高网站的安全性
|