什么是前端工程化?
- 随着业务日益复杂和多元化,前端开发已不是从前的webPage模式,而是webApp模式,业务复杂了,就会产生一系列的问题,例如怎么进行多人团队的高效开发,怎么提高开发质量,如何提高可维护性?
- 前端工程化是架构中重要的一个部分,用来解决上述的问题,从软件工程的角度来研究前端工程。
前端工程化的因素
模块化
模块化?
将一个大文件拆分成多个相互依赖的小文件,再进行统一拼装和加载,这样才能进行多人协同开发。
模块化规范分为哪几种?
JS模块化
- 浏览器端的模块化规范:AMD,CMD
- 服务器端的模块化规范:CommonJS规范
- ES6模块化规范 1.如何默认导入/导出?
使用 export default { 成员名... }进行默认导出
使用 import 接收名称 from "模块标识符" 进行默认导入
2、如何按需导入/导出?
export let num = 999; 按需导出某个成员
import { num } from "./test.js";按需导入其他模块的成员
3、如何直接导入并执行js代码?
import "./test.js";
css模块化
- 虽然Sass、Less、Stylus等预处理器实现了CSS的文件拆分,但没有解决CSS模块化的一个重要问题:选择器的全局污染问题。按道理,一个模块化的文件应该要隐藏内部作用域,只暴露少量接口给使用者。而按照目前预处理器的方式,导入一个CSS模块后,已存在的样式有被覆盖的风险。虽然重写样式是CSS的一个优势,但这并不利于多人协作。
- 所以制定了一些css命名风格
- BEM风格
- Bootstrap风格
- Semantic UI风格 从工具层面,社区又创造出Shadow DOM、CSS in JS和CSS Modules三种解决方案。
- Shadow DOM是WebComponents的标准。它能解决全局污染问题,但目前很多浏览器不兼容,对我们来说还很久远
- CSS in JS是彻底抛弃CSS,使用JS或JSON来写样式。这种方法很激进,不能利用现有的CSS技术,而且处理伪类等问题比较困难
- CSS Modules仍然使用CSS,只是让JS来管理依赖。它能够最大化地结合CSS生态和JS模块化能力,目前来看是最好的解决方案。Vue的scoped style也算是一种
资源模块化
资源模块化后,有三个好处:
- 依赖关系单一化。所有CSS和图片等资源的依赖关系统一走JS路线,无需额外处理CSS预处理器的依赖关系,也不需处理代码迁移时的图片合并、字体图片等路径问题
- 资源处理集成化。现在可以用loader对各种资源做各种事情,比如复杂的vue-loader等等。
- 项目结构清晰化。
组件化
- 分治思想,拆分
- 复用
规范化
- 约束一些好的习惯 1.目录结构的制定 2.编码规范 3.前后端接口规范 4.文档规范 5.组件管理 6.Git分支管理 7.Commit描述规范 8.定期CodeReview 9.视觉图标规范...
自动化
重复的交给自动化工具
webpack的使用
如何安装webpack?
npm install --save-dev webpack
因为是webpack4.0+版本,所以还需要安装webpack-cli。
npm install --save-dev webpack-cli
全局安装:
npm install --global webpack
如何配置webpack打包的入口和出口
var path = require('path');
module.exports = {
mode: 'development', //模式生产者是production
entry: './foo.js', //入口
output: { //出口
path: path.resolve(__dirname, 'dist'),
filename: 'foo.bundle.js'
}
};
使用loader加载css文件等
你可以使用 loader 告诉 webpack 加载 CSS 文件
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
{ loader: 'style-loader' },
{
loader: 'css-loader',
options: {
modules: true
}
},
{ loader: 'sass-loader' }
]
}
]
}
};
配置webpack的自动打包功能
配置html-webpack-plugin并生成预览页面
- 安装 html-webpack-plugin
npm install --save-dev html-webpack-plugin
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: {
main: "./src/script/main.js",
a: "./src/script/a.js"
},
plugins: [
new HtmlWebpackPlugin({
title: 'Output Management'
})
],
output: {
filename: "[name]-[hash].bundle.js",
path: path.resolve(__dirname, 'dist')
}
};
热加载
安装webpack dev sever:
npm install webpack-dev-server --g
运行webpack-dev-server 得到服务端localhost:8888,默认路径为./dist,打开dist里的app.html或者module.js,然后更改src里的文件,保存后会自动更新打包并加载新页面
module.exports = {
...
devServer: {
contentBase: path.resolve(__dirname, './dist'),
host: 'localhost',
compress: true,
port: 8888,
historyApiFallback: true,
}
...
}