开发脚手架及封装自动化构建工作流

714 阅读5分钟

开发脚手架及封装自动化构建工作流

工程化概述

工程化概念:

前端工程化是指遵循一定标准和规范,通过工具去提高效率、降低成本的一种手段。<br />
工程化是一种概念上的思想,而非单单一门或特定技术。

工程化因素:

模块化、组件化、规范化、自动化四方面因素

1、模块化:

     将一个大的文件拆分成多个模块,按照一个个小模块来划分,利于复用和组合

2、组件化:

    将展现层内容拆分成功能独立的小单元,利于维护、复用
    模块化不等于组件化,模块化偏向于文件资源层面划分,而组件化偏向于UI展现层划分,提高开发效率和代码复用率

3、规范化:

    遵循公共或一定的标准规范,可以提高项目与代码的质量,利于多人协作开发和后期维护,降低后期成本

4、自动化:
    
    简单、重复性的工作交由工具(或程序)来完成,既可以提高开发效率,也可以减少人为因素出错概率
    

工程化解决的问题:

1、传统语言或语法的弊端

   如想要使用ES6+新特性,但兼容有问题;想要使用Less/Sass/PostCSS增强CSS的编程性,但是运行环境不能直接支持


2、无法使用模块化、组件化

   想要使用模块化的方式提高项目的可维护性,但运行环境不能直接支持

3、重复的机械式工作

   部署上线前需要手动压缩代码及资源文件,部署过程需要手动上传代码到服务器

4、代码风格统一,质量保证

   多人协作开发, 无法硬性统一大家的代码风格,从仓库pull回来的代码质量无法保证

5、依赖后端服务接口支持

   部分功能开发时需要等待后端服务接口提前完成

6、整体依赖后端项目

   需要部署到后端项目相应目录中,依赖项目结构和服务环境

项目中工程化表现

  • 创建项目:自动创建统一项目结构
  • 编码环节:代码风格、校验,构建、打包,编译
  • 预览环节:本地预览和热更新体验,源码映射,web服务
  • 代码提交:代码提交前检查,包括风格与质量
  • 部署环节:自动发布,ci/cd

工程化核心

对项目整体的规划或架构,工具只是帮助落地的手段

脚手架工具

常用脚手架工具

  • create-react-app
  • vue-cli
  • angular-cli
  • ...

Yeoman

通用脚手架工具

  • 安装
## 全局范围内安装yo工具
yarn global add yo

## 安装对应的generator
yarn global add generator-node

## 创建项目目录
mkdir my-module

## 进入项目目录
cd my-module

## 通过yo运行generator
yo node

按照提示依次输入信息,关键字是逗号分隔的数组

Sub Generator

  • 安装命令
yo node:cli
  • 执行命令链接
yarn link
  • 使用自己注册的cli命令

    这里会有几个问题:

    • 命令有可能会重复(开始默认包名),最好是起一个好记忆又不重复的
    • 创建完成后使用时在Mac系统上可能出现 permission denied 问题,需要使用 chmod u+x ./lib/cli.js 来更改权限,后边路径为cli命令文件路径
    • 不是所有子集都有cli,要查看是否有

Yeoman 使用总结

  • 1、明确你的需求
  • 2、找到合适的Generator
  • 3、全局范围安装找到的Generator
  • 4、通过Yo 运营对应的Generator
  • 5、通过命令行交互填写选项
  • 6、生成您所需要的项目结构

如生成网站类应用,需要在Yeoman官方网站去查找

同时安装时有些C++依赖没有镜像加速,可设置淘宝镜像加速,如node-sass

自定义Generator

创建你Generator模块

本质上是创建一个Npm模块

要求:

  • Generator有自己特有的基本结构
  • 名成年必须generator-开头,后边跟上自己的名字,此时才可以找到这个模块

具体过程

  • 首先创建一个以generator-开头的目录
  • 目录内初始化yarn
  • 安装yeoman-generator的一个基类包
  • 项目中创建一个特有目录结构
  • 在index.js中写入如下要求内容
  • 通过yarn link将模块进行注册
  • 最后在其他项目目录中使用 yo sample(自己模块名)来使用
// generator核心入口
// 继承自Yeoman Generator
// 导出

// 使用 destinationPath 获取运行时当前项目路径,并传递文件名称
// 如若是传入多个参数,则代表是创建目录,最后一个是文件

// write第二个参数为写入内容

const Generator = require('yeoman-generator');

module.exports = class extends Generator {
    writing() {
        // 此方法会 在生成文件阶段调用此方法
        this.fs.write(
            this.destinationPath('text.txt', 'text1.txt'),
            Math.random().toString()
        )
    }
}

模板创建

  • 在generators-app目录下,新建templates目录
  • 在templates目录下创建文件
  • 在模板文件中可以是话用EJS语法,动态输出内容呢
  • 模块方法改为如下:
    // 通过 templatePath 获取templates目录下指定内容作为模板
    const tmpl = this.templatePath('foo.txt');
    // 要输出的目标路径
    const output = this.destinationPath('foo.txt')
    // 模板数据上下文
    const context = { title: 'Hello 贾贵山', success: false };

    this.fs.copyTpl(tmpl, output, context);

接收用户输入

通过实现 prompting方法,内部返回 this. prompt, 方法接收数组参数组,数组项为对象,对象key为:类型-input,name-最终得到的数据的一个键,message-你想问的话,default-appname,为项目生成目录后作为默认,方法的then,参数为输入的内容

github项目

详见:github.com/jiaguishan/…

自动化构建

常用的自动化构建工具

  • grunt // 基于临时文件
  • gulp // 基于内存完成,同时任务
  • fis

Grunt

const done = this.async();
done();

done(false); // 失败时

gulp

详见:github.com/jiaguishan/…