一: 什么是脚手架?
1: 一句话理解: 脚手架就是通过简单的命令行创建工程项目的已设定的基本骨架.
2: 常见的前端脚手架:
- vue.js官方脚手架: vue-cli: @vue/cli(截止目前版本: 4.5.10)
- react.js官方脚手架: create-react-app(截止目前版本: 4.0.1)
- angular.js官方脚手架: angular-cli: @angular/cli(截止目前版本: 11.0.7)
3: 基本骨架可能包括:
- 项目架构目录
- 一些必须依赖项: eg: rouer, store, axios…
- 基本结构配置: eg: webpack基本配置
- 可扩展入口
二: 脚手架的工作原理是什么?
脚手架工作过程:
通过命令行询问用户输入 => 根据用户输入生成结果文件
三: cli(Command Line Interface)
1.cli是啥 ?
cli是一种通过命令行来交互的工具或应用, eg: vue-cli, angular-cli
2.cli能做啥 ?
通过简单的命令询问,根据用户输入生成指定的文件, 代替人工重复劳动,提升开发效率
四: 创建脚手架的方式有哪些(除了特定框架的官方脚手架以外)?
1: yeoman脚手架定制自己的脚手架
1: 安装yeoman工具
- yarn global add yo
- yarn global add generator-node
2: 创建脚手架步骤:
- 创建一个文件夹: eg: generator-example(generator模块必须以generator开头)
- 初始化package.json: yarn init
- 添加generator工具: yarn add yeoman-generator
- 创建generators/app/index.js文件: 这个index.js文件作为generators的核心入口
- 创建模版,模版内容存放地址: generators/app/templates
- 将生成器链接到本地的全局范围: yarn link(作用是: 可以在本地用自己创建的包做测试)
- 新建一个文件目录,运行生成器: yo example
3: 发布generator到npm
- 先在github创建generator名: generator-example.
- 创建.gitignore 文件: echo node_modules > .gitignore.
- 初始化git仓库: git init
- 查看本地仓库状态: git status
- 将generator添加到本地仓库: git add .
- git commit -m “generator:init”
- git remote add origin xxx(github 仓库地址)
- git push -u origin master
- 发布到npm之前:
- 首先去npm官网检查下包有没有被占用.
- 再去npm注册账号
- 最后在加上npm账号填写相关信息: npm adduser
发布: npm: npm publish —registry=http://registry.npmjs.org ;
yarn: yarn publish —registry=https://registry.yarnpkg.com
4: generators/app/index.js核心代码如下:
// 引入yeoman-generator
const Generator = require("yeoman-generator");
module.exports = class extends Generator {
// yeoman在询问用户环节会自动调用此方法
// 在此方法中可以调用父类的prompt()方法发出对用户命令对询问
return this.prompt([
{
type: "input",
name: "name",
message: "Your project name"
default: this.appname
}
])
.then(answers => {
// 用户的输入的结果
// answers: { name: "user input value" }
this.answers = answers;
})
// 将模板文件写入目标文件
writing(){
const templates = [
"babel.config.js",
"package-lock.json",
"package.json",
"postcss.config.js",
"README.md",
"src/assets/logo.png",
"src/components/HelloWorld.vue",
"src/components/timeSelect.vue",
"src/router/router.js",
"src/store/mutations.js",
"src/store/index.js",
"src/store/actions.js",
"src/store/modules/home.js",
"src/views/About.vue",
"src/App.vue",
"src/main.js",
"src/registerServiceWorker.js",
"public/favicon.ico",
"public/index.html",
"public/manifest.json",
"public/robots.txt"
];
templates.forEach(file => {
this.fs.copyTpl(
// 读取模板文件
this.templatePath(file),
// 写入目标文件
this.destinationPath(file),
// 用户输入的内容
this.answers,
)
})
}
}
2: node cli定制自己的脚手架
1: 创建一个空文件夹: my-scaffolding
2: 初始化package.json: yarn init
3: 安装依赖ejs,inquirer: yarn add inquirer ejs
4: 跟目录下创建cli.js
#!/usr/bin/env node
// 注意: Node cli入口文件必须这样开头.
// 如果是Linux或者macOS系统的化还需要修改此文件的读写权限
// macOS的具体命令为: sudo chmod -R 755 cli.js
// 脚手架的工作过程:
// 1: 通过命令询问用户问题
// 2: 更具用户输入生成结果文件
// cli.js核心代码如下:
const fs = require("fs");
const path = require("path");
// 捕获用户输入并做读写操作的依赖
const inquirer = require("inquirer");
// 读取模板的引擎
const ejs = require("ejs");
inquirer.prompt([
{
type: "input",
name: "name",
message: "Project name"
}
])
.then(answers => {
// 根据用户回答生成结果文件
// console.log(answers)
// 模版目录
const templateDir = path.join(__dirname, "templates");
// 目标目录
const targetDir = process.cwd();
// 将模板目录下的文件全部转到目标目录
fs.readdir(templateDir, (err, files) => {
if (err) {
throw err;
}
files.forEach(file => {
// console.log(file)
// 通过模板赢取渲染文件
ejs.renderFile(path.join(templateDir, file), answers, (err, result) => {
if (err) {
throw err;
}
// console.log(result)
// 将结果写入目标文件路径
fs.writeFileSync(path.join(targetDir, file), result)
})
})
})
})
5: package.json中引入: {“bin”:”cli.js”},
6: 根目录下创建模板文件夹: templates
7: 将生成器链接到本地的全局范围: yarn link
8: 运行生成器: my-scaffolding
9: 发布与yeoman生成器相同