Node自动生成文件模板

1,990 阅读1分钟

一、初始化,准备工作

会生成一个package.json文件

在当前文件夹下建一个目录scripts存放脚本文件generateProects.jstemplate.js

并在package.json中加入命令

"scripts": {    
    "create": "node ./scripts/generateProject"
},

二、编写模板文件

module.exports = {
    vueTemplate: 
    `
        <template>          
            <div>              
                <h1>这是模板生成的文件</h1>          
            </div>        
        </template>        
        <script>        
            export default {
                data() {
                    return {}
                },
                created(){}
                methods: {}        
            }        
        </script>        
        <style  scoped></style>
    `
}

三、编写脚本generateProject.js

const chalk = require('chalk') // 这个库需要手动安装npm i chalk
const path = require('path')
const fs = require('fs')
const pathResolve = (...file) => path.resolve(__dirname, ...file)
const log = message => console.log(chalk.green(`${message}`))
const successLog = message => console.log(chalk.blue(`${message}`))
const errorLog = error => console.log(chalk.red(`${error}`))

const { vueTemplate } = require('./template.js') // 引入模板文件

log('请输入文件名称')
process.stdin.on('data', async chunk => {  
    const inputName = String(chunk).trim().toString()  
    /**   * 文件目录路径   */  
    const projectDirectory = pathResolve('../src', inputName) // 生成目录放在src下  
    const hasprojectDirectory = fs.existsSync(projectDirectory)  
    if (hasprojectDirectory) { 
        // 判断目录是否存在    
        errorLog(`${inputName}项目目录已存在,请重新输入`)  
    } else {    
        log(`正在生成 文件目录 ${projectDirectory}`)    
        dotExistDirectoryCreate(pathResolve(projectDirectory)) // 创建文件夹    
        await generateFile(pathResolve(projectDirectory, `${inputName}.vue`), vueTemplate) // 创建文件    
        successLog('文件生成成功')  
    }  
    process.stdin.emit('end')
})
process.stdin.on('end', () => { 
    // 结束后退出  process.exit()
})

// 创建文件
function generateFile(path, data) {  
    if (fs.existsSync(path)) {    
        errorLog(`${path}文件已存在`)    
        return  
    }  
    return new Promise((resolve, reject) => {    
        fs.writeFile(path, data, 'utf8', err => {      
            if (err) {        
                errorLog(err.message)        
                reject(err)      
            } else {        
                resolve(true)      
            }    
        })  
    })
}

// 创建文件夹
function dotExistDirectoryCreate(directory) {  
    return new Promise(resolve => {    
        mkdirs(directory, function () {      
            resolve()    
        })  
    })
}
// 递归创建目录
function mkdirs(directory, callback) {  
    const exists = fs.existsSync(directory)  
    if (exists) {    
        callback()  
    } else {    
        mkdirs(path.dirname(directory), () => {      
            fs.mkdirSync(directory)      
            callback()    
        })  
    }
}

四、最终结果

文件目录

文件结构

文件内容