前言
首先我们先了解什么是前端工程化,再来看前端工程化的有哪些解决方案解决方案,其次了解webpack的基本使用及其常用插件。最后看看webpack是如何实现打包发布的,以及如何通过Source Map来帮助我们排错。
前端工程化
一、小白眼中的前端VS实际的前端开发
- 小白眼中的前端
只要会HTML、CSS、JavaScript就可以开发 想快速实现布局结构,layUI拿过来就成 想要操作DOM或者向服务器发送Ajax请求,拽个jQuery过来
- 实际上的前端开发
模块化
(js的模块化、css的模块化、资源的模块化)
组件化
(复用现有的UI结构、样式、行为)
规范化
(目录结构的划分、编码规范化、接口规范化、文档规范化、Git分支管理)
自动化
(自动化构建、自动部署、自动化测试)
二、什么是前端工程化
在企业级的前端项目开发中,把前端开发所需的工具、技术、流程、经验等进行规范化、标准化。
三、前端工程化的好处
前端开发自成体系
,有一套标准的开发方案和流程。
四、前端工程化的解决方案
- 早期的前端工程化解决方案
grunt(https://www.gruntjs.net/
)
gulp(https://www.gulpjs.com.cn/
)
2. 目前主流的前端工程化解决方案
webpack(https://www.webpackjs.com/
)
parcel(https://zh.parceljs.org/
)
webpack
一、什么是webpack
1、概念
前端项目工程化的具体解决方案
2、 主要功能
能提供友好的前端模块化开发支持,以及代码压缩混淆
、处理浏览器端JavaScript的兼容性
、性能优化
等强大的功能
3、好处
让程序员把工作的重心放到具体功能的实现上,提高了前端开发效率
和项目的可维护性
。·
二、webpack基本使用
1、在项目中安装webpack
npm install webpack@5.42.1 webpack-cli@4.7.2 -D
2、在项目中配置webpack
在文件根目录下新建 webpack.config.js
文件,在文件中书写以下代码
module.exports = {
// 指定构建模式,有两个参数可选
// 开发阶段使用development,因为打包速度快
// 上线阶段使用production,因为项目上线需要文件体积小
mode:'development'
}
- mode节点可选值
- development
开发环境
不会对打包生成的文件进行代码压缩和性能优化
打包速度快,适合开发阶段使用
- production
生产环境
会对打包生成的文件进行代码压缩和性能优化
打包速度慢,仅适合项目发布阶段使用
- webpack.config.js文件的作用
webpack.config.js是webpack的配置文件。webpack在真正开始打包构建之前,会先读取这个配置文件,从而基于给定的配置,对项目进行打包。
注
:由于webpack是基于node.js开发出来的打包工具,因此在它的配置文件中,支持使用node.js相关的语法和模块进行webpack的个性化配置。
在package.json
的scripts节点下,新增 dev 脚本如下
"scripts":{
// npm run dev
"dev":"webpack"
}
在cmd终端中运行npm run dev
,启动webpack进行项目的打包构建
3、webpack打包入口、出口
- 默认约定
在webpack 4.x 和 5.x 版本中,有如下的默认约定
①默认的打包入口文件为 src -> index.js
②默认的输出文件路径为 dist -> main.js
2. 自定义打包的入口与出口
在webpack.config.js
配置文件中,通过entry
节点指定打包的入口。通过output
节点指定打包的出口
const path = require('path')
module.exports = {
mode:'development',
//entry:'指定要处理哪个文件'
entry:path.join(__dirname,'src/xxx.js'),
//指定生成的文件要存放到哪里
output:{
//存放的目录
path: path.join(__dirname,'dist'),
//生成的文件名
filename: 'bundle.js'
}
}
- 问题:每次修改源代码,都需要在终端执行
npm run dev
命令。十分的麻烦!
三、webpack中的插件
1、webpack插件的作用
通过安装和配置第三方的插件,可以拓展webpack的能力,从而让webpack用起来更方便。
2、常用的插件
- webpack-dev-server
- 作用
类似于node.js阶段用到的nodemon工具 每当修改了源代码,webpack会自动进行项目的打包和构建
- npm命令
终端中运行如下命令 npm install webpack-dev-server@3.11.2 -D
- 配置
修改 package.json
-> scripts中的 dev 命令中如下
再次运行 npm run dev
命令,重新进行项目的打包
在浏览器中访问 http://localhost:8080
查看打包效果
"scripts": {
"dev":"webpack serve"
}
注
:生成的出口文件在根目录中,是保存在内存
中的
- html-webpack-plugin
- 作用
webpack中的HTML插件 可以通过此插件自定制index.html页面的内容
- npm命令
终端中运行如下命令 npm install html-webpack-plugin@5.3.2 -D
- 配置
在 webpack.config.js 文件中配置
//导入 html-webpack-plugin 这个插件,得到插件的构造函数
const HtmlPlugin = require('html-webpack-plugin')
//创建 html 插件的实例对象
const htmlPlugin = new HtmlPlugin({
//指定原文件的存放路径
template:'./src/index.html',
//指定生成的文件的存放路径
filename:'./index.html'
})
module.exports = {
mode:'development',
//通过 plugins 节点,是 htmlPlugin 生效
//插件的数组,将来 webpack 在运行时,会加载调用这些插件
plugins:[htmlPlugin]
}
注
:会在 index.html 中自动注入一个script脚本
复制的index.html页面同样保存在内存
中
3、devServer节点
在webpack.config.js
中添加如下
devServer : {
//初次打包后自动打开浏览器
open:true,
//修改端口号
//在http协议中,如果端口号是80,则可以被省略
port:80,
//指定运行的主机地址
host:'127.0.0.1'
}
注
:凡是修改了webpack.config.js配置文件,或修改了package.json配置文件,必须重启实时打包的服务器,否则最新的配置文件无法生效!
四、webpack中的loader(加载器)
在实际开发过程中,webpack默认只能打包处理以 .js 后缀名结尾的模块。其他非 .js 后缀名结尾的模块,webpack默认处理不了,需要调用loader加载器才可以正常打包,否则会报错!
1、loader加载器的作用
协助webpack打包处理特定的文件模块。
2、常用的loader加载器
- 打包处理css 文件(css-loader)
- npm命令
运行 npm i style-loader@3.0.0 css-loader@5.2.6 -D
- 配置
在 webpack.config.js
的module -> rules 数组中,添加 loader 规则如下
module:{
rules:[
//test是文件类型
//use表示对应要调用的loader
{test:/\.css$/,use:['style-loader','css-loader']}
]
}
注
:use中的loader顺序是固定的,调用顺序从后往前调用。
- 打包处理less文件(less-loader)
- npm命令
运行npm i less-loader@10.0.1 less@4.1.1 -D
命令
- 配置
在 webpack.config.js
的module -> rules 数组中,添加 loader 规则如下
module:{
rules:[
//文件后缀名的匹配规则
{test:/\.less$/,use:['style-loader','css-loader','less-loader']}
]
}
- 打包处理样式表中与url路径相关的文件(file-loader)
- npm命令
运行npm i url-loader@4.1.1 file-loader@6.2.0 -D
- 配置
在 webpack.config.js
的module -> rules 数组中,添加 loader 规则如下
module:{
rules:[
//处理图片文件的loader
//如果需要调用的 loader 只有一个,则值传递一个字符串也行,如有多个loader
{test:/\.jpg|png|gif$/,use:'url-loader?limit-22229'}
]
}
其中 ?
之后的是loader的参数项:
limit用来指定**图片的大小**,单位是字节(byte)
只有 ≤ limit 大小的图片,才会被转为base64格式的图片
- 打包处理js文件中的高级语法(babel-loader)
- npm命令
运行npm i babel-loader@8.2.2 @babel/core@7.14.6 @babel/plugin-proposal-decorators@7.14.5 -D
- 配置
在 webpack.config.js 的module -> rules 数组中,添加 loader 规则如下
module:{
rules:[
//在配置babel-loader的时候,程序员只需要把自己的代码进行转换即可;一定要排除 node_modules目录中的js文件
{test:/\.js$/,use:'babel-loader',exclude:/node_modules/}
]
}
根目录新建babel.config.js
,定义Babel的配置项如下:
module.exports = {
//声明babel可用的插件
plugins:[['@babel/plugin-proposal-decorators',{legacy:true}]]
}
打包发布
一、为什么要打包发布?
- 开发环境下,打包生成的文件存放于内存中,无法获取到最终打包生成的文件
- 开发环境下,打包生成的文件不会进行代码压缩和性能优化
二、配置 webpack的打包发布
在 package.json
文件的 scripts 节点下,新增build 命令如下:
"scripts":{
//开发环境中,运行 dev 命令
"dev":"webpack serve",
//项目发布时,运行build命令
"build":"webpack --mode production"
}
--model 是一个参数项,用来指定 webpack 的运行模式。production代表生产环境,会对打包生成的文件进行代码压缩和性能优化。
注
:通过--model指定的参数项,会覆盖 webpack.config.js
中的model选项
1、把JavaScript文件统一生成到js目录中
在webpack.config.js
配置文件的output
节点中,进行如下配置:
output: {
path: path.join(__dirname,'dist'),
// 明确告诉 webpack 把生成的 bundle.js 文件放到 dist 目录下的 js 子目录中
filename: 'js/bundle.js'
}
2、把图片文件统一生成到image目录中
修改 webpack.config.js
中的 url-loader
配置项,新增outputPath
选项即可指定图片文件的输出路径:
{
test: /\.jpg|png|gif$/,
use: {
loader: 'url-loader',
options: {
limit: 22228,
// 明确指定把打包生成的图片文件,存储到 dist 目录下的image 文件夹中
outputPath: 'image'
}
}
}
3、自动清理dist目录下的旧文件
参考网址:https://www.npmjs.com/package/clean-webpack-plugin
Source Map
一、Source Map是什么?
就是一个信息文件,里面存储这位置信息。也就是说, Source Map文件中存储着压缩混淆后的代码,所对应的转换前的位置。
二、 如何使用?
- 开发环境下
推荐在 webpack.config.js
中添加如下的配置,即可保证运行时报错的行数
与源代码的行数
保持一致
module.exports = {
mode:'development',
devtool:'eval-source-map'
}
- 生产环境下
如果省略了 devtool 选项,则最终生成的文件中不包含 Source Map。这能够防止原始代码通过 Source Map的形式暴露给别有所图之人。
或者将 devtool
的值设置为nosources-source-map
,这样只会定位出错行数,而不暴露源码。
补充
一、npm命令补充
- -S 是
--save
的简写
明确告诉npm将第三方模块名称和版本号写在dependencies中
2. -D是--save-dev
的简写
-D 明确告诉npm 将该文件放到devDependencies中
只在开发阶段需要用到,就使用 -D 将文件放到devDependencies中
二、使用 @ 表示src源代码目录
在 webpack.config.js
中新增一个 resolve
节点
resolve:{
alias:{
//告诉 webpack ,程序员写的代码中,@符号表示 src 这一层目录
'@':path.join(__dirname,'/src/')
}
}
总结
关于前端工程化的解决方案,Vue为我们提供了 Vue CLI脚手架工具,其基于 webpack 构建,并带有合理的默认配置。可以让我们更专注撰写应用上,而不用花费好几天的时间纠结配置的问题。最后给大家奉上Vue CLI官网地址https://cli.vuejs.org/zh/
,今天就到这里,拜拜~
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!