# simple-scaffolding **Repository Path**: hh_self/simple-scaffolding ## Basic Information - **Project Name**: simple-scaffolding - **Description**: 使用node编写一个简易版的脚手架,用来理解脚手架工作原理 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-14 - **Last Updated**: 2025-04-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 脚手架是什么? > 脚手架其实就是nodejs的一个cli应用 ## 脚手架都做了什么? 以`vue`为例 1. 安装 vue-cli 2. 运行 vue create app 3. 命令行交互 4. 生成项目基础结构 ## 使用nodeJs实现一款简单的脚手架,来更加直观的了解一下脚手架的工作过程 ### 创建文件 ```shell mkdir sample-scaffolding cd sample-scaffolding # 初始化package.json文件 yarn init ``` ## 编辑package.json文件 > 添加bin字段,指定入口文件 ```json { "bin": "cli.js" } ``` ## 根目录创建 cli.js 文件,并编写逻辑 ```js #!/usr/bin/env node // node cli 应用入口文件必须要有这样的文件头 // 如果是 Linux 或者 macOS 系统下还需要修改此文件的读写权限为 755 // 其实就是通过 chmod 755 cli.js 实现修改 const fs = require('fs') const path = require('path') const inquirer = require('inquirer') const ejs = require('ejs') // 1. 通过命令行交互询问用户问题 // 询问需要用到 node 的 inquirer 模块 // 在命令行运行 yarn add inquirer inquirer.prompt([ { type: 'input', name: 'name', message: 'project name?' } ]) .then(anwsers => { // 2. 根据用户回答的结果来生成文件 // 模版目录 // 在根目录创建 templates 文件夹, 并在内部创建一些模版文件 const tmplDir = path.join(__dirname, 'templates') // 目标目录 (在哪里运行,在哪里生成文件) const destDir = process.cwd() // 获取到运行命令的文件夹路径 // 将模版下的文件全部输出到目标目录 fs.readdir(tmplDir, (err, files) => { if (err) throw err files.forEach(file => { // file 就是相对路径 // 安装模版引擎,这里使用的是 ejs // 在命令行运行 yarn add ejs ejs.renderFile(path.join(tmplDir, file), anwsers, (e, result) => { if (e) throw e fs.writeFileSync(path.join(destDir, file), result) }) }) }) }) ``` ## 应用 ```shell # 将此文件 link 到全局 yarn link # 执行模块名,即package.json里name属性对应的值 sample-scaffolding ## 就可以在目标目录生成对应格式的文件 ```