脚手架工作过程
1.通过命令行交互询问用户问题
2.根据回答生成文件
初始化模块
1.初始化项目,在package.json添加bin入口
2.创建入口文件,添加#!/usr/bin/env node 标识
获取用户输入
使用inquirer模块进行交互
inquirer.prompt([
{
type:'input',
name:'name',
message:'project name?'
}
]).then(answers => {
})
获取文件路径
使用path模块获取模板目录,_dirname代表项目当前目录,process.cwd()获取命令窗口目录
const tmplDir = path.join(_dirname,'templates')
const destDir = process.cwd()
将模板目录文件写到目标目录中
1.使用fs模块的readdir方法获取到模板文件的相对路径
2.使用模板引擎ejs的renderFile方法渲染文件
3.使用fs的writeFileSync方法写入到目标文件
fs.readdir(tmplDir,(err,files)=>{
if(err) throw err
files.forEach(item=>{
ejs.renderFile(path.join(tmplDir,item),answers,(err,res)=>{
if (err) throw err
fs.writeFileSync(path.join(destDir,item),res)
})
})
})
完整代码
#!/usr/bin/env node
const inquirer = require('inquirer')
const path = require('path')
const fs = require('fs')
const ejs = require('ejs')
inquirer.prompt([
{
type:'input',
name:'name',
message:'project name?'
}
]).then(answers => {
//模板目录
//_dirname是项目当前目录,process.cwd是命令行执行的目录
const tmplDir = path.join(_dirname,'templates')
const destDir = process.cwd()
//将模板目录的文件写入到目标目录中
//fs.readdir用于读取目录下的所有文件
//ejs.renderFile方法参数:1.绝对路径 2.渲染参数 3.回调函数
fs.readdir(tmplDir,(err,files)=>{
if(err) throw err
files.forEach(item=>{
ejs.renderFile(path.join(tmplDir,item),answers,(err,res)=>{
if (err) throw err
fs.writeFileSync(path.join(destDir,item),res)
})
})
})
})