首页 > 其他分享 >前端工程化详解

前端工程化详解

时间:2023-02-27 09:35:54浏览次数:42  
标签:版本 -- 前端 dev js 详解 模块 工程化 save

1、工程化概要

系统级体系建设:编码、测试、构建、发布、运行、维护一整套体系

  • 编码(可学习umi)
    • 技术选型:React\vue, KOA\Nestjs
    • 开发模式:前后端分离、同构直出
    • 组件库:antd、elementui
    • mock方案:PWA mock、node server mock、mockjs
    • 全家桶:路由、状态管理、调试工具
    • 脚手架:手写、CRA、vuecli
    • 目录划分、领域模型设计、分支管理方案、微前端
  • 测试:TDD、自动化测试
  • 构建
    • 打包
    • 文件压缩
    • code splitting
    • cache
    • 更新:增量更新、热更新
    • css预处理或后处理
    • build bundle or chunk
  • 部署
    • 持续集成/持续交付(CI/CD)
    • NGINX
    • Docker、K8S
    • 灰度
    • 监控
    • Jenkins

前端工程化主要聚焦构建流程:使用工具处理与业务无关的内容:js编译、打包、压缩、图片合并优化等各方面的工程性代码

2、具体类目

1、包管理工具

package manager: bower(不常用)、npm、yarn、pnpm

1、npm

全称node package manager,安装在node_modules目录下,必须拥有package.json文件,所有下载的模块,最终都会记录在package-lock.json 完全锁定版本,下次我们再 npm install 时,就会先下载 package-lock.json 里面的版本:

  • name:包或者模块的名称
  • version:版本,大版本 - 次要版本 - 小版本
    • :以大版本和次要版本为主,eg:1.3.2,安装1.3.x的最新 把呢不能
    • :以大版本为主,eg:1.3.2,安装1.x.x的最新版本
  • main:默认加载的入口文件
  • devDependencies:本地开发需要运行的模块
  • dependencies:运行时需要的模块
  • optionalDependencies:可选的模块,即使安装失败安装进程也会正常退出
  • peerDependencies:必须依赖的版本模块

面试题1:devDependencies、dependencies、optionalDependencies 和 peerDependencies 区别
解析:

  1. devDependencies 是指使用本地开发时需要使用的模块,而真正的业务运行时不用的内容
  2. dependencies 是指业务运行时需要的模块
  3. optionalDependencies 是可选模块,安不安装均可 ,即使安装失败,包的安装过程也不会报错
  4. peerDependencies 必须依赖的版本模块,一般用在大型框架和库的插件上,例如我们写 webpack--xx-plugin 的时候,对于使用者而言,他一定会先有 webpack 再安装我们的这个模块,这里的 peerDependencies 就是约束了包中 webpack 的版本。

面试题2:npm 中 --save-dev 和 --save 之间的区别

  1. save-dev 和 save 都会把模块安装到 node_modules 目录下。
  2. save-dev 会将依赖名称和版本写到 devDependencies 下, 而 save 会 将依赖名称和版本写到 dependencies 下。

2、yarn

并发和块,常用命令可参考 官网:yarn参考,具体为:

  • 全部安装:yarn install
  • 添加:yarn add xx@xx | yarn add xx --dev | yarn global add xx
  • 更新:yarn up xx@xx
  • 移除 :yarn remove xx
  • 运行:yarn xx

3、pnpm

使用命令类似npm

2、静态检查和格式化工具

1、eslint

  • 安装:npm install eslint --save-dev,本地运行依赖
  • 配置:.eslintrc(全局配置)、文件配置/* no-unused-vars: off */
  • 配置脚本
    • eslint index.js,可配置在package.json脚本中
    • eslint --fix *.js(--fix默认修复)
  • 丰富的插件,可参考:eslint官网

2、prettier

格式化工具,配置文件 .prettierrc,参考:prettier官网

3、es的编译

将es语法编译成支持的版本语法,常见工具为babel

4、打包工具

模块化规范:commonjs、amd、cmd、esmodule,打包抹平模块化差异。

1、browserify

将commonjs模块转换为可在浏览器运行的模块

npm install --save-dev browserify // 安装
browserify index.js -o output.js // 执行

// index.js
const moduleA =require('./moduleA')
console.log(moduleA);

// moduleA.js
module.exports = 'hello world'

// output.js
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
const moduleA = require("./moduleA");
console.log(moduleA);

},{"./moduleA":2}],2:[function(require,module,exports){
module.exports = "hello world";

},{}]},{},[1]);

2、rollup

tree shaking概念:对esmodule模块进行静态分析和处理,已经删除无用代码

npm install --save-dev rollup // 安装
rollup index.js --file output.js // 输出

// index.js
import { add } from './module'
const result = add(1, 2)
console.log(result);

// moduleA.js
export function add(a, b) {
  return a + b
}
export function log() {
  return true;
}

// output.js, tree shaking去除了log()函数
function add(a, b) {
  return a + b;
}

const result = add(1, 2);
console.log(result);

编译和打包

对于模块化相关的import和export关键字,babel最终会将它编译为包含require 和 exports 的CommonJS 规范。这就造成了另一个问题,这样带有模块化关键词的模块,编译之后还是没办法直接运行再浏览器中,因为浏览器端并不能运行 CommonJS 的模块。为了能再 WEB 端直接使用 CommonJS 规范的模块,除了编译之外,我们还需要一个步骤叫做打包(bundle)。
所以打包工具例如 webpack / rollup,编译工具 babel 它们之间的区别和作用就很清楚了

  • 打包工具主要处理的是 JS 不同版本间模块化的区别
  • 编译工具主要处理的是 JS 版本间语义的问题

5、JS 压缩工具

uglifyjs index.js -o output.js

添加 --source-map 在运行时生成 sitemap 文件,方便我们进行 debug

6、流程化工具

1、grunt

流程式处理工具

  • 安装:npm install --save-dev grunt
  • 安装相关工具及grunt插件:npm --save-dev @babel/core @babel/preset-env grunt-babel grunt-contrib-uglify
  • 配置gruntfile.js脚本,执行grunt进行编译和压缩等流程

问题:容易出现配置兼容等问题

2、gulp

流程式处理工具,安装gulp,新建 gulpfifile.js 配置,执行 gulp 任务。相比 grunt 来说,配置更加清晰,是一个链式调用的写法。

3、fis3

通用处理工具:fifis 是国内百度公司在早期发布的一款前端通用处理工具,fifis3 是它的第三代,使用 node.js 重写,不再是一个普通工具,而是一个具有插件化的系统,有着丰富和完善的社区环境,属于前端解决方案。

4、webpack

通用处理工具:
webpack 实际上和 gulp grunt 这类的任务处理工具有些类似,但是它本身具有打包的功能,同时也支持通过中间件和插件实现其他领域的功能,最终通过一个命令就能处理完成所有操作。
webpack 通过 webpack.config.js 配置, 配置 loader 中间件来对不同文件进行操作,同时通过插件化的配置,支持例如压缩等操作。

3、工程化典范

node的server的架构工程说明

  • 持续继承CI:gitlab、gerrit 做分支管理
  • 开发技术选型:express、koa、egg
  • 开发dev:中间件sso权限管理、安全控制、ORM数据库映射、CAT监控(接口等)
  • 部署deploy:机器申请(dev/prod)、数据库申请(dev/prod)、网关域名DNS映射、编译构建打包(commpile.sh编译、run.sh执行、check.sh心跳检测、manifest.yml构建文件(target: os、version、maven、runscript))
  • 部署平台:deploy server/client,配置文件放置,通过点击操作即可实现部署配置

标签:版本,--,前端,dev,js,详解,模块,工程化,save
From: https://www.cnblogs.com/DTCLOUD/p/17158567.html

相关文章

  • 前端性能精进之优化方法论(二)——分析
    在上一节中曾提到过两种性能监控:SYN和RUM,那么对应的也有两种分析:数据分析和实验室分析。数据分析会通过采集上来的性能信息来剖析和定位可能存在的各种问题。......
  • 申报发布项目单点登录调试时候,前端请求前缀带了sbgl,没有重写sbgl,然后后端数据库的路由
       1.从数据库修改表数据,redis不会更新这个数据,所以得重启redis才能看到最新效果,但是你从前端界面修改路由的话,那就不用立马重启redis,因为一般自己设计的框架都会自......
  • Qt 自动单元测试Auto Test Project详解
    官方:https://www.qt.io/product/testing-toolshttps://doc.qt.io/qt-5/qttestlib-tutorial1-example.html目录:使用QtTest进行C++单元测试–第1部分–简介使用......
  • docker 数据卷详解
    docker数据卷参考:dockervolumes1.为什么需要数据卷?一个容器运行一段时间,会产生一些数据,日志等,如果数据放到容器中,如果容器删除了,数据就没了。2.什么是数据卷?可以......
  • 基于 Solidity 的智能合约详解
    @目录环境合约代码详解环境https://remix.ethereum.org/基于Remix编写,Remix是一种基于Web的集成开发环境(IDE),专门用于开发和部署以太坊智能合约。Remix具有代码编辑器......
  • 5.6-MIPS指令详解
    R型指令操作数和结果都是通过寄存器进行的OP:操作码,所有R型指令中全部为0Rs:寄存器编号,对应第一个源操作数Rt:寄存器编号,对应第二个源操作数Rd:寄存器编号,据此保存结果......
  • 前端疑问1
     1,如果想给盒子添加高度和宽度,默认是向哪个方向添加<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"......
  • K8Syaml文件详解
    一、K8S支持的文件格式kubernetes支持YAML和JSON文件格式管理资源对象。JSON格式:主要用于api接口之间消息的传递YAML格式:用于配置和管理,YAML是一种简洁的非标记性语言,内......
  • 【Redis】字符串String 数据类型详解
    String是Redis最基本的数据类型,一个Key对应一个Value,一个Redis中字符串Value最多可以是512MString类型是二进制安全的,意味着Redis的String可以包含任何数据。比如照片或者序......
  • 前端常考react面试题(持续更新中)
    reactdiff算法我们知道React会维护两个虚拟DOM,那么是如何来比较,如何来判断,做出最优的解呢?这就用到了diff算法diff算法的作用计算出VirtualDOM中真正变化的部分,并......