自动化构建
什么是构建
所谓构建,是指将源代码转换成生产代码的过程。
为什么需要将源代码转换成生产代码?或者说需要构建哪些内容?
- 代码需要编译( CSS3,JS6+ ), 保证浏览器的兼容性
- 代码需要压缩( CSS,JS,HTML,图片等 )。节省带宽,提高加载速度
- 代码需要做格式化校验,统一代码风格。
以上这些问题,都是构建的内容。
什么是自动化构建
不管是代码压缩还是 less 转换,通过手动方式进行工作量巨大(例如手动压缩2000行代码,估计程序员就疯了)。
自动化构建是指将手动构建任务,进行排列组合,然后通过命令(或工具)自动执行的过程。
实现自动化构建最简单的方式是 npm scripts (npm 脚本)。
npm scripts
npm 允许在 package.json 文件里面,使用 scripts 字段定义脚本命令。
{
"scripts": {
// 命令名称: 任务
"foo": "node bar.js"
}
}
scripts 字段是一个对象。它的每一个属性,对应一段脚本。比如,foo 命令对应的脚本是node bar.js。
# 命令行下使用 npm run <命令>,就可以执行这段脚本。
npm run foo
# 等同于执行
node bar.js
npm scripts任务的执行方式
如果 npm 脚本里面需要执行多个任务,那么需要明确它们的执行顺序。 如何选择正确的任务执行顺序?
- 串行执行:任务之间有明确的先后顺序,必须先执行前一个任务,然后才能执行下一个任务
- 相当于 4X100 接力,拿到上一个队员的接力棒后,下一个队员才能继续跑
- 并行执行:任务之间没有明确的先后顺序,同时执行,可以提高效率
- 相当于 100 米短跑,8个人同时起跑
如果是并行执行(即同时的平行执行),可以使用
&符号。
- 相当于 100 米短跑,8个人同时起跑
{
"scripts": {
"parallel": "node task1.js & node task2.js & node task3.js"
}
}
如果是串行执行(前一个任务成功后,才执行下一个任务),可以使用 && 符号。
{
"scripts": {
"series": "node task1.js && node task2.js && node task3.js"
}
}
但是,& 符号在 Windows 操作系统下不起作用。 此时,我们可以借助插件,在 Windows 下实现并 npm-run-all
# 先在项目中安装
npm i npm-run-all -D
# 并行执行:其中 p 是 parallel(并行)的意思
npm-run-all -p 脚本1 脚本2 脚本3
# 或简写为
run-p 脚本1 脚本2 脚本3
# 串行执行:其中 s 是 series(串行)的意思
npm-run-all -s 脚本1 脚本2 脚本3
# 或简写为
run-s 脚本1 脚本2 脚本3
构建样式文件
构建样式文件就是将开发环境下的 CSS (包括 Less 或 Sass)源代码,转成线上环境使用的代码。这里的构建任务可能有多个。
以构建Less编译和压缩的样式文件为例:
- 编译 less 文件
# 安装 less 包,编译 less 文件
npm i less -g
# 在 package.json 中,添加 less 解析命令
"scripts": {
"style": "lessc style.less style.css",
}
# 执行命令(自动编译)
npm run style
- 压缩 css 文件
# 安装 minify 包, 压缩文件
npm i minify -g
# 在 package.json 中,添加 minify 压缩命令
"scripts": {
# 先编译 && 然后压缩
"style": "lessc style.less style.css && minify style.css > style.min.css",
}
# 执行命令(自动编译)
npm run style
构建脚本文件
为解决ES6+的浏览器兼容问题,我们需要构建脚本文件来处理。
在开发过程中,经常使用 ES6+ 新特性时,一些旧的浏览器,不支持 JS 的新语法。所以,在项目上线之前,就需要将新的语法特性解析成兼容性更好的 ES5 。最常用的编译工具是 Babel,Babel插件可以将ES6+新语法转成ES5。 Babel官网:babeljs.io/
构建步骤:
- 初始化项目(npminit-yes)
- 安装Babel(npminstall-gbabel-corebabe卜cli)
- 安装转换规则(npminstall-gbabel-preset-env)
- 配置转换规则()
- 在npm scripts中添加转换命令(babelsrc-ddist)
- 执行转换命令
# 安装 babel核心,Babel客户端
npm i -g babel-core babel-cli

# 安装转码规则
npm i -g babel-preset-env
# 在项目根目录下,新建 .babelrc 文件(注意文件名前有一个点),并添加转换规则
{
"presets": [
"env"
],
}
# 通过 babel 编译单个 j s文件
babel input.js --out-file output.js
# 或者
babel input.js -o output.js
# 通过 babel 编译整个目录
babel js --out-dir scripts
# 或者
babel js -d scripts
# 在 package.json 中,添加 babel 解析命令
"scripts": {
"script": "babel js -d scripts",
}
# 执行命令(自动编译)
npm run script
如果 Babel 是局部安装。则babel 的可执行路径是:./node_modules/.bin/babel
命令需要做相应的调整
babel js -d scripts ===> ./node_modules/.bin/babel js -d scripts
添加压缩命令
# 在 package.json 中,添加 babel 解析和压缩命令
"scripts": {
"script": "babel js -d scripts && minify scripts/main.js > scripts/script.min.js",
}
自动化构建对于现代的前端开发非常关键,这也催生了很多优秀的自动化构建工具。这里推荐Gulp。
代码格式校验
每个程序员都有自己的编码习惯,最常见的莫过于:
- 有的人代码结尾必须加分号
;,有的人觉得不加分号;更好看; - 有的人写字符串时,喜欢用双引号,而有的人喜欢用单引号;
- 有的人代码缩进喜欢用 4 个空格,有的人喜欢用 2 个空格;
诸如此类,但是项目开发一般是多人协作,所以,不同的工程师,写的代码风格不同。一般你写自己的代码怎么折腾都没关系,但整个项目需要有一个统一的编码规范。这样别人看源码就能够看得懂。
那么问题来了,总不能一行行去检查代码吧,这是一件很蠢的事情。凡是重复性的工作,都应该通过工具来完成。
这个工具应该做两件事情:
- 提供编码规范
- 根据编码规范,自动检查代码。
在前端工程化中,不同的代码,使用不同的工具进行检测。
例如:通常我们使用 ESLint 来检测 JavaScript 代码;我们使用 StyleLint 来检测 CSS 代码。
ESLint使用
ESLint 是 JSLint 的升级版本,是用来检查 JS 代码质量的插件。通过 ESLint 可以统一不同开发者的代码风格。
官网:eslint.org/
ESLint使用步骤:
- 初始化项目(npm init --yes)
- 安装ESLint(npm i eslint -g)
- 初始化配置文件(eslint --init)
- 检查JS代码格式
- 单个文件(eslint path/filenamejs)
- 整个目录(eslint path/dirname)
先创建项目
mkdir lint-demo
cd lint-demo
# 初始化项目,生成 package.json
npm init --yes
安装 ESLint:
但使用 EsLint 有一个先决条件:Node.js (>=6.14), npm version 3+。
$ npm i eslint -g
初始化一个配置文件:
# 之后进入交互窗口,询问一些问题;根据问题生成配置文件 例如:.eslintrc.json
$ eslint --init
配置规则
rules: { "规则名": [规则值, 规则配置] }
其中规则值有以下 3 种:0 = off, 1 = warn, 2 = error
"off" 或 0 - 关闭规则
"warn" 或 1 - 开启规则,使用警告级别的错误:warn (不会导致程序退出)
"error" 或 2 - 开启规则,使用错误级别的错误:error (当被触发的时候,程序会退出)
更多规则详情查看:eslint.org/docs/rules/
# 配置检测规则
{
"env": {
"browser": true,
"commonjs": true,
"es2021": true
},
"extends": "eslint:recommended",
"parserOptions": {
"ecmaVersion": 12
},
"rules": {
"indent": [ "error", 2 ], # 使用两个空格缩进
"quotes": [ "error", "double" ] # 使用双引号包裹字符串
}
}
之后,你可以在任何文件或目录上运行ESLint如下:
$ eslint yourfile.js
拓展阅读:检测 JS 代码风格的工具有多个,除了 ESLint, 另一个常用的是 Standard:
StyleLint使用
StyleLint 是检测 CSS 代码格式的插件。
使用步骤:
- 初始化项目(
npm init --yes) - 安装StyleLint(
npm install --global stylelint) - 安装检测标准(
npm install --global stylelint-config-standard) - 创建配置文件(
.stylelintrc.json) - 检查css代码格式
- 单个文件(
stylelint path/filename.css) - 整个项目(
stylelint **/*.css)
- 单个文件(
StyleLint 初体验
安装插件
代码风格标准:github.com/stylelint/s…
# stylelint 是运行工具,stylelint-config-standard 是 stylelint 的推荐配置
npm i --g stylelint stylelint-config-standard
在项目的根目录下,创建 .stylelintrc.json 文件,添加如下配置
{
"extends": "stylelint-config-standard",
"rules": {
# 除了使用 stylelint-config-standard,我们还可以在 rules 字段中自定义校验规则
"block-no-empty": true # 代码块不能为空
}
}
运行 stylelint,检测 CSS 代码格式
# 注意:路径是写在双引号中的
# 检测一个文件
stylelint 文件路径/文件名.css
# 检测整个项目下,所有的 CSS 文件
stylelint **/*.css