我们发现,不管是yoeman还是plop,都是通过用户输入的结果,创建相关类型的项目结果,而这些也可以通过Node进行模拟实现
- 新建项目文件 simulation-scaffold
- 初始化项目:
yarn init -y - 在package.json中添加入口文件:
- 在里面添加一行:` “bin”:“cli.js”,
- 然后创建cli.js文件,编写入口文件内容
- 编写特定头文件
#! /usr/bin/env node - 测试:在cli.js中写入
console.log('sx') - 通过yarn link 映射到全局
- 通过输入项目名:simulation-scaffold即可运行。
#! /usr/bin/env node
console.log('sx')
- 接下来需要接受用户的输入
- 安装输入接收模块:
yarn add inquirer - 简单配置如下:
#! /usr/bin/env node
const inquirer = require("inquirer")
inquirer.prompt([
{
type:'input',
name:'projectName',
message:'Project name'
}
])
.then(ans=>{
console.log(ans)
})
- 接收到用户的输入之后,需要生成相应的文件,而文件的生成需要先创建好模板,然后只需要渲染模板,就能生成相关文件
- 创建template文件夹,创建相应的模板,模板遵循ejs规范
- 在node中依次读取到模板文件夹里的文件,然后根据用户输入的数据渲染
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%= projectName%></title>
<link rel="stylesheet" href="./index.css">
</head>
<body>
<h1><%= projectName%></h1>
</body>
</html>
- 读取到的文件需要挨个渲染,借助ejs模块可以实现渲染:
yarn add ejs - 最终将渲染的字符串生成文件即可
#! /usr/bin/env node
const inquirer = require("inquirer")
const ejs = require("ejs")
const fs = require("fs")
const path = require("path")
inquirer.prompt([
{
type: 'input',
name: 'projectName',
message: 'Project name'
}
])
.then(ans => {
const tmpDir = path.join(__dirname, 'template')
const targetDir = process.cwd()
fs.readdir(tmpDir, (err, file) => {
if (err) {
throw err
}
file.forEach(fe=>{
ejs.renderFile(path.join(tmpDir,fe),ans,(err,result)=>{
if(err)
throw err
fs.writeFileSync(path.join(targetDir,fe),result)
})
})
})
})
|