vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component

栏目: JavaScript · 发布时间: 6年前

内容简介:做前端的大家都知道通过本文就是通过为了方便我们能看清控制台输出的各种语句,我们先安装一下

做前端的大家都知道通过 vue 开发的项目每次创建新组建的时候,都要新建一个目录,然后新增 .vue 文件,在这个文件中再写入 templatescriptstyle 这些内容,虽然在写入的时候大家都有自己的自动补全共计,不过这些都是模板性的,每次都要这样重复操作,很麻烦有没有。

vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component

本文就是通过 node 来帮助我们,自动去执行这些重复操作,而我们只需要告诉控制台我们需要创建的组件名字就可以了。 本文自动创建的组件包含两个文件:入口文件 index.js 、vue文件 main.vue

vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component

chalk工具

为了方便我们能看清控制台输出的各种语句,我们先安装一下 chalk npm install chalk --save-dev

1. 创建views

  • 在根目录中创建一个 scripts 文件夹
  • scripts 中创建 generateView 文件夹
  • generateView 中新建 index.js ,放置生成组件的代码
  • generateView 中新建 template.js ,放置组件模板的代码,模板内容可根据项目需求自行修改

index.js

// index.js
const chalk = require('chalk')
const path = require('path')
const fs = require('fs')
const resolve = (...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,
    entryTemplate
} = require('./template')
// 生成文件
const 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)
            }
        })
    })
}
log('请输入要生成的页面组件名称、会生成在 views/目录下')
let componentName = ''
process.stdin.on('data', async chunk => {
    // 组件名称
    const inputName = String(chunk).trim().toString()
    // Vue页面组件路径
    const componentPath = resolve('../../src/views', inputName)
    // vue文件
    const vueFile = resolve(componentPath, 'main.vue')
    // 入口文件
    const entryFile = resolve(componentPath, 'entry.js')
    // 判断组件文件夹是否存在
    const hasComponentExists = fs.existsSync(componentPath)
    if (hasComponentExists) {
        errorLog(`${inputName}页面组件已存在,请重新输入`)
        return
    } else {
        log(`正在生成 component 目录 ${componentPath}`)
        await dotExistDirectoryCreate(componentPath)
    }
    try {
        // 获取组件名
        if (inputName.includes('/')) {
            const inputArr = inputName.split('/')
            componentName = inputArr[inputArr.length - 1]
        } else {
            componentName = inputName
        }
        log(`正在生成 vue 文件 ${vueFile}`)
        await generateFile(vueFile, vueTemplate(componentName))
        log(`正在生成 entry 文件 ${entryFile}`)
        await generateFile(entryFile, entryTemplate(componentName))
        successLog('生成成功')
    } catch (e) {
        errorLog(e.message)
    }

    process.stdin.emit('end')
})
process.stdin.on('end', () => {
    log('exit')
    process.exit()
})

function dotExistDirectoryCreate(directory) {
    return new Promise((resolve) => {
        mkdirs(directory, function() {
            resolve(true)
        })
    })
}
// 递归创建目录
function mkdirs(directory, callback) {
    var exists = fs.existsSync(directory)
    if (exists) {
        callback()
    } else {
        mkdirs(path.dirname(directory), function() {
            fs.mkdirSync(directory)
            callback()
        })
    }
}
复制代码

template.js

// template.js
module.exports = {
    vueTemplate: compoenntName => {
        return `<template>
	<div class="${compoenntName}">
		${compoenntName}组件
	</div>
</template>
<script>
export default {
	name: '${compoenntName}'
};
</script>
<style lang="stylus" scoped>
.${compoenntName} {
};
</style>`
    },
    entryTemplate: compoenntName => {
        return `import ${compoenntName} from './main.vue'
export default [{
	path: "/${compoenntName}",
	name: "${compoenntName}",
	component: ${compoenntName}
}]`
    }
}
复制代码

1.1 配置package.json

"new:view": "node ./scripts/generateView/index"
复制代码

如果使用 npm 的话 就是 npm run new:view 如果是 yarn 自行修改命令

1.2 结果

vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component

2. 创建component

  • 跟views基本一样的步骤
  • scripts 中创建 generateComponent 文件夹
  • generateComponent 中新建 index.js ,放置生成组件的代码
  • generateComponent 中新建 template.js ,放置组件模板的代码,模板内容可根据项目需求自行修改

index.js

// index.js`
const chalk = require('chalk')
const path = require('path')
const fs = require('fs')
const resolve = (...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,
    entryTemplate
} = require('./template')

const 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)
            }
        })
    })
}
log('请输入要生成的组件名称、如需生成全局组件,请加 global/ 前缀')
let componentName = ''
process.stdin.on('data', async chunk => {
    const inputName = String(chunk).trim().toString()
        /**
         * 组件目录路径
         */
    const componentDirectory = resolve('../../src/components', inputName)

    /**
     * vue组件路径
     */
    const componentVueName = resolve(componentDirectory, 'main.vue')
        /**
         * 入口文件路径
         */
    const entryComponentName = resolve(componentDirectory, 'index.js')

    const hasComponentDirectory = fs.existsSync(componentDirectory)
    if (hasComponentDirectory) {
        errorLog(`${inputName}组件目录已存在,请重新输入`)
        return
    } else {
        log(`正在生成 component 目录 ${componentDirectory}`)
        await dotExistDirectoryCreate(componentDirectory)
            // fs.mkdirSync(componentDirectory);
    }
    try {
        if (inputName.includes('/')) {
            const inputArr = inputName.split('/')
            componentName = inputArr[inputArr.length - 1]
        } else {
            componentName = inputName
        }
        log(`正在生成 vue 文件 ${componentVueName}`)
        await generateFile(componentVueName, vueTemplate(componentName))
        log(`正在生成 entry 文件 ${entryComponentName}`)
        await generateFile(entryComponentName, entryTemplate)
        successLog('生成成功')
    } catch (e) {
        errorLog(e.message)
    }

    process.stdin.emit('end')
})
process.stdin.on('end', () => {
    log('exit')
    process.exit()
})

function dotExistDirectoryCreate(directory) {
    return new Promise((resolve) => {
        mkdirs(directory, function() {
            resolve(true)
        })
    })
}

// 递归创建目录
function mkdirs(directory, callback) {
    var exists = fs.existsSync(directory)
    if (exists) {
        callback()
    } else {
        mkdirs(path.dirname(directory), function() {
            fs.mkdirSync(directory)
            callback()
        })
    }
}
复制代码

template.js

// template.js
module.exports = {
    vueTemplate: compoenntName => {
        return `<template>
	<div class="${compoenntName}">
		${compoenntName}组件
	</div>
</template>
<script>
export default {
	name: '${compoenntName}'
};
</script>
<style lang="stylus" scoped>
.${compoenntName} {
};
</style>`
    },
    entryTemplate: `import Main from './main.vue'
export default Main`
}
复制代码

2.1 配置package.json

"new:comp": "node ./scripts/generateComponent/index"
复制代码

如果使用 npm 的话 就是 npm run new:comp 如果是 yarn 自行修改命令

2.2 结果

vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component

通过以上的 vue-cli3 优化,我们项目在开发的过程中就能非常方便的通过命令快速创建公共组件和其他页面了,在页面、组件比较多的项目中,可以为我们提高一些效率,也可以通过这样的命令,来控制团队内不同人员新建文件的格式规范。

vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Algorithmic Beauty of Plants

The Algorithmic Beauty of Plants

Przemyslaw Prusinkiewicz、Aristid Lindenmayer / Springer / 1996-4-18 / USD 99.00

Now available in an affordable softcover edition, this classic in Springer's acclaimed Virtual Laboratory series is the first comprehensive account of the computer simulation of plant development. 150......一起来看看 《The Algorithmic Beauty of Plants》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具