前端工程化(一)

2020-07-05  本文已影响0人  望月从良glh

以前刀耕火种的年代


以前的前端.png 问题分类.png

概念

前端工程化是指遵循一定的规范和标准,通过工具去降低成本,提高效率的手段。一切以提高效率,保证质量,降低成本为目的的手段都属于工程化

工程化 != 工具

工程化是对我们整体项目的规划和架构 工具只是帮我们去实现这种规划的一种手段
creat-react-app vue-cli 是集成式的工程化方案,并不是单纯的脚手架
不仅创建的项目,约定了项目应该是什么样的结构
提供了热更新开发服务,自动编译 vue 的单文件组件,代码分格的校验

工程化应该归功于 node,由 node 强力驱动

四个维度实现:

任何简单机械的重复劳动都应该让机器去完成。

具体落实前端工程化

脚手架工具

创建基础项目结构,提供项目规范和约定

常用脚手架

React => create-react-app
vue => vue-cli
angular => angular-cli
yeoman 通用型脚手架工具
Plop 创建特定类型文件

脚手架的实现过程

mkdir my-cli
yarn init
"bin":"cli.js"
$ chmod 755 cli.js
#!usr/bin/env node
console.log('glh')
yarn link
my-cli

执行完再终端就会看到打印结果为 glh

要通过命令行询问用户、需要安装 inqurier

yarn add inquirer

根据用户输入动态生成文件

const inquirer = require('inquirer');
const path = require('path');
const fs = require('fs');
const ejs = require('ejs');
inquirer
  .prompt([
    {
      type: 'input',
      name: 'name',
      message: 'Preject name',
    },
  ])
  .then(anwsers => {
    // 模板目录
    const templDir = path.join(__dirname, 'templetes');

    // 目标路径
    const destDir = process.cwd();

    fs.readdir(templDir, (err, files) => {
      if (err) throw err;
      files.forEach(file => {
        ejs.renderFile(path.join(templDir, file),  anwsers, (err, result) => {
          if (err) throw err;
          fs.writeFileSync(path.join(destDir, file), result);
        });
      });
    });
  });

上面过程大致意思就是在脚手架根目录创建一个 templetes 目录,用来存放我们的模板文件,然后根据用户输入,通过 ejs 模板引擎的 renderFile 方法把我们的用户输入结果和模板相结合,输出到我们脚手架使用时候文件的根目录

自动化构建

一切重复的工作都应该自动化,将我们生产环境的源代码,转化为生产环境可以运行的代码或者程序,我们把这样一个过程称之为自动化构建工作流。这样的作用就脱离运行环境带来的兼容问题,在开发阶段使用一些提高效率的语法,规范和标准

Gulp

使用注意事项

// 4.0版本以上
exports.foo = done = {
  console.log('同步代码')
  done()
}
const { series, parallel } require('gulp')
// 串行模式
exports.foo = series(task1, task2)
// 并行模式
exports.foo = parallel(task1, task2)
const fs = require('fs');
const { Transform } = require('stream');
exports.default = () => {
  const read = fs.createReadStream('index.js');
  const write = fs.createWriteStream('index.js');
  const transform = new Transform({
    transfor: (chunk, encoding, callback) => {
      const input = chunk.toString();
      const output = input.replace(/\s+/g, '').replace(/\/\*.+?\*\//g, '');
      callback(null, output);
    },
  });
  read.pipe(transform).pipe(write);
  return read;
};
上一篇 下一篇

猜你喜欢

热点阅读