腳手架工作過程
1.通過命令行交互詢問用戶問題
2.根據(jù)回答生成文件
初始化模塊
1.初始化項(xiàng)目,在package.json添加bin入口
2.創(chuàng)建入口文件,添加#!/usr/bin/env node 標(biāo)識(shí)
獲取用戶輸入
使用inquirer模塊進(jìn)行交互
inquirer.prompt([
{
type:'input',
name:'name',
message:'project name?'
}
]).then(answers => {
})
獲取文件路徑
使用path模塊獲取模板目錄,_dirname代表項(xiàng)目當(dāng)前目錄,process.cwd()獲取命令窗口目錄
const tmplDir = path.join(_dirname,'templates')
const destDir = process.cwd()
將模板目錄文件寫到目標(biāo)目錄中
1.使用fs模塊的readdir方法獲取到模板文件的相對(duì)路徑
2.使用模板引擎ejs的renderFile方法渲染文件
3.使用fs的writeFileSync方法寫入到目標(biāo)文件
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是項(xiàng)目當(dāng)前目錄,process.cwd是命令行執(zhí)行的目錄
const tmplDir = path.join(_dirname,'templates')
const destDir = process.cwd()
//將模板目錄的文件寫入到目標(biāo)目錄中
//fs.readdir用于讀取目錄下的所有文件
//ejs.renderFile方法參數(shù):1.絕對(duì)路徑 2.渲染參數(shù) 3.回調(diào)函數(shù)
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)
})
})
})
})