同样的道理,有了上面的经验,我们照葫芦画瓢来处理一下我们的全局组件。这就没什么可说的了,直接上核心代码
组织结构
components // 组件文件夹 |__xxx.vue // 其他组件 |__global // 全局组件文件夹 |__index.js // 自动化处理文件 |__demo.vue // 全局demo组件
global处理
import Vue from 'vue' let contexts = require.context('.', false, /\.vue$/) contexts.keys().forEach(component => { let componentEntity = contexts(component).default // 使用内置的组件名称 进行全局组件注册 Vue.component(componentEntity.name, componentEntity) })
使用和说明
这个使用起来就更简单了,直接在app.js
引用这个文件就行。
注意:我之前看到有些人做法是使用组件名去区分全局组件和普通组件,然后通过正则去判断需不需要全局注册。我是直接把全局的组件放到global
文件夹下,然后组件的注册名称直接使用component.name
。至于使用哪种方式就比较看个人了。
充分利用NodeJS
放着node
这么好得东西不用真是有点浪费,那么我们来看看node
能为我们增加效率做出什么贡献。
有这么一个场景,我们每次创建模块的时候都要新建一个vue
文件和对应的router
配置,而且新页面的大部分东西都还差不多,还得去复制粘贴别得页面。这想想就有点low
。那既然有了node
我们可不可以通过node
来做这写乱七八糟得事情? 下面来把我们的想法付诸于显示。
我们实现这个功能主要要借助Node
的fs和process, 感兴趣的话可以深入研究一下。
首先我们要编写我们的node
脚本,这里是一个比较简单的版本。什么验证文件夹或者文件的都没有,只是来实现我们这个想法:
/* * fast add new module script */ const path = require('path') const fs = require('fs') const chalk = require('chalk') const reslove = file => path.resolve(__dirname, '../src', file) // symbol const const RouterSymbol = Symbol('router'), ViewsSymbol = Symbol('views') // root path const rootPath = { [RouterSymbol]: reslove('router/modules'), [ViewsSymbol]: reslove('views') } //loggs const errorLog = error => console.log(chalk.red(`${error}`)) const defaultLog = log => console.log(chalk.green(`${log}`)) // module name let moduleName = new String() let fileType = new String() //const string const vueFile = module => (`<template> </template> <script> export default { name: '${module}', data () { return { } }, methods: { }, created() { } } </script> <style lang="less"> </style> `) // route file const routerFile = module => (`// write your comment here... export default [ { path: '/${module}', name: '', redirect: '/${module}', component: () => import('@/views/frame/Frame'), children: [ { path: '', fullPath: '', name: '', component: () => import('@/views/${module}/index') } ] } ] `) /** * generate file * @param {*} filePath * @param {*} content * @param {*} dirPath */ const generateFile = async (filePath, content, dirPath = '') =>{ try { // create file if file not exit if (dirPath !== '' && ! await fs.existsSync(dirPath)) { await fs.mkdirSync(dirPath) defaultLog(`created ${dirPath}`) } if (! await fs.existsSync(filePath)) { // create file await fs.openSync(filePath, 'w') defaultLog(`created ${filePath}`) } await fs.writeFileSync(filePath, content, 'utf8') } catch (error) { errorLog(error) } } // module-method map const generates = new Map([ ['view', async (module) => { // module file const filePath = path.join(rootPath[ViewsSymbol], module) const vuePath = path.join(filePath, '/index.vue') await generateFile(vuePath, vueFile(module), filePath) }], // router is not need new folder ['router',async (module) => { const routerPath = path.join(rootPath[RouterSymbol], `/${module}.js`) await generateFile(routerPath, routerFile(module)) }] ]) defaultLog(`请输入模块名称(英文):`) // files const files = ['view', 'router'] // 和命令行进行交互 获取的创建的模块名称 process.stdin.on('data', (chunk) => { try { if (!moduleName) { moduleName = chunk } else { chunk = chunk.slice(0,-2) // delete /n defaultLog(`new module name is ${chunk}`) files.forEach(async (el, index) => { // 执行创建语句 await generates.get(`${el}`).call(null, chunk.toString()) if (index === files.length-1) { process.stdin.emit('end') } }) } } catch (error) { errorLog(error) } }) process.stdin.on('end', () => { defaultLog('create module success') })
内容版权声明:除非注明,否则皆为本站原创文章。