搭建过程
-
打开命令行,通过mkdir创建一个项目目录
mkdir sample-scaffolding -
切入到这个项目目录下
cd sample-scaffolding -
通过yarn init -y 命令初始化一个package.json的文件
yarn init -y -
通过code .命令使用vscode打开这个目录
-
在package.json文件中添加bin字段,用于去指定一下cli应用的入口文件
{ "name": "sample-scaffolding", "version": "1.0.0", "main": "index.js", "bin": "cli.js", "license": "MIT" } -
新建这个cli.js
- 注意:cli 的入口文件 cli.js 中必须要有一个特定的文件头 #!/usr/bin/env node
-
在命令行执行 yarn link 使得当前模块link到全局
-
使用inquirer 模块用于在node中发起命令行交互询问
- yarn add inquirer
-
根目录下新建templates目录,里面放模板文件(index.html和index.css)
// index.html <!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><%= name %></title> </head> <body> </body> </html> -
cli.js 中使用node提供的path模块去获取路径
-
cli.js 中使用node提供的fs模块去读取和写入文件
-
安装ejs模块用于渲染模板文件
yarn add ejs -
最后使用fs的writeFileSync方法将ejs渲染的结果写入到目标文件中,代码如下
#!/usr/bin/env node const fs = require('fs') const inquirer = require('inquirer') const path = require('path') const ejs = require('ejs') inquirer.prompt([ { type: 'input', name: 'name', message: 'Project name?' } ]) .then(anwsers => { // 模板目录 const tmplDir = path.join(__dirname, 'templates') // 目标目录 const destDir = process.cwd() // 将模板目录下的文件全部转换到目标目录 fs.readdir(tmplDir, (err, files) => { if(err) throw err files.forEach(file => { ejs.renderFile(path.join(tmplDir, file), anwsers, (err, results) => { if(err) throw err fs.writeFileSync(path.join(destDir, file), results) }) }) }) })
使用方法
-
选择一个目标文件夹,打开命令版,新建一个文件夹,并切换到此文件夹,执行sample-scaffolding命令
mkdir xxx cd xxx sample-scaffolding -
此时命令行会弹出一个预设的问题让输入名称,输入自定义名称
-
此时在xxx文件夹里已生成想要的模板文件内容