这里先简单了解一下基础知识,接下来会基于typescript和rollup参考写一个较为完整的脚手架(动态模板),如下只能拉取较为简单的静态模板。javascript
这里假设咱们的脚手架名字是ds-cli,如下都用这个名字。咱们在命令行使用脚手架命令为ds前端
//这里是main.js
#!/usr/bin/env node
// --这种用法是为了防止操做系统用户没有将node装在默认的/usr/bin路径里。当系统看到这一行的时候,
// 首先会到env设置里查找node的安装路径,再调用对应路径下的解释器程序完成操做。
//这里是package.json
"bin": {
"ds": "./main.js"
}
复制代码
const cmd = require("commander");
// 好比咱们想执行ds init **的命令,想出现“初始化组件模板”的描述
// action是执行这个命令后续的回调,...args是后面**的参数
cmd
.command('init')
.description('初始化组件模板')
.action((...args) => {});
//解析命令行
cmd.parse(process.argv);
复制代码
咱们经过询问用户来得到必定的交互,这样能够知道用户须要什么vue
//好比咱们在上面那个action里面搞事情,即ds init以后问用户
...action((...args)=>{
inquirer
.prompt([
{
name: "description",
message: "请输入项目描述"
},
{
name: "author",
message: "请输入做者名称"
}
]).then(answers=>{
//在这里得到上面的答案
console.log(answers.description,answers.author)
})
})
复制代码
const download = require("download-git-repo");
// 第一个git地址,第二个name是git clone下来后的名字...
download(
"https://github.com/yokiyokiyoki/vue-fullpage.git#master",
name,
{ clone: true },
err => {
...
}
);
复制代码
//这个是经过download-git-repo拉下来的package.json
{
"author":"{{author}}",
"description":"{{description}}"
}
复制代码
//经过询问拿到的answers
const meta = {
name,
description: answers.description,
author: answers.author
};
const fileName = `${name}/package.json`;
//判断一下是否有这个文件
if (fs.existsSync(fileName)) {
const content = fs.readFileSync(fileName).toString();
const result = handlebars.compile(content)(meta);
fs.writeFileSync(fileName, result);
}
复制代码
const spinner = ora("正在下载模板...");
spinner.start();
spinner.succeed();
复制代码
#!/usr/bin/env node
// --这种用法是为了防止操做系统用户没有将node装在默认的/usr/bin路径里。当系统看到这一行的时候,
// 首先会到env设置里查找node的安装路径,再调用对应路径下的解释器程序完成操做。
const program = require("commander");
const download = require("download-git-repo");
const inquirer = require("inquirer");
const handlebars = require("handlebars");
const fs = require("fs");
const ora = require("ora");
const chalk = require("chalk");
const symbols = require("log-symbols");
program
.version("0.0.1", "-v, --version")
.command("init <name>")
.action(name => {
if (fs.existsSync(name)) {
// 错误提示项目已存在,避免覆盖原有项目
console.log(symbols.error, chalk.red("项目已存在"));
return;
}
inquirer
.prompt([
{
name: "description",
message: "请输入项目描述"
},
{
name: "author",
message: "请输入做者名称"
}
])
.then(answers => {
download(
"https://git.datatub.com:Uranus/general-template#master",
name,
{ clone: true },
err => {
const spinner = ora("正在下载模板...");
spinner.start();
if (!err) {
spinner.succeed();
const meta = {
name,
description: answers.description,
author: answers.author
};
const fileName = `${name}/package.json`;
if (fs.existsSync(fileName)) {
const content = fs.readFileSync(fileName).toString();
const result = handlebars.compile(content)(meta);
fs.writeFileSync(fileName, result);
}
console.log(symbols.success, chalk.green("项目初始化完成"));
} else {
spinner.fail();
console.log(symbols.error, chalk.red(`拉取远程仓库失败${err}`));
}
}
);
});
});
//解析命令行
program.parse(process.argv);
复制代码
前端如何搭建一个成熟的脚手架java