vue的基于webpack项目,通过node生成组件

45 篇文章 1 订阅
21 篇文章 3 订阅

做前端的大家都知道通过 vue 开发的项目每次创建新组建的时候,都要新建一个目录,然后新增 .vue /.js/.less文件,在这个文件中再写入 template 、 引入script 和style 这些内容,虽然在写入的时候大家都有自己的自动补全,不过每次都要这样重复操作,很麻烦有没有。

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

1.安装chalk  (chalk是一个颜色的插件,为了方便我们能看清控制台输出的各种语句,我们先安装一下 chalk)

npm install chalk --save-dev

2.创建

  • 在根目录中创建一个 scripts 文件夹
  • 在 scripts 中创建  index.js ,放置生成组件的代码
  • 在 scripts 中创建  viewsTemplateToods.js组建模板代码
  • 在 scripts 中创建在 template文件夹, 并在template中新建 vueTemplate.js和jsTemplate.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.yellow(`${ message }`));
const successLog = message => console.log(chalk.green(`${ message }`));
const errorLog = error => console.log(chalk.red(`${ error }`));
// 导入模板
const { vueTemplate, jsTemplate, lessTemplate } = require('./viewsTemplateToods');
// 生成文件
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('请输入要生成的页面名称:');
let componentName = '';
process.stdin.on('data', async chunk => {
  // 组件名称
  const inputName = String(chunk).trim().toString();
  //vue组件路径
  const componentDirectory = resolve('../src/views', inputName);
  //生成vue模板
  const componentVueName = resolve(componentDirectory, `${ inputName }.vue`);
  //生成js
  const entryComponentName = resolve(componentDirectory, `${ inputName }.js`);
  //生成less
  const componentStyleName = resolve(componentDirectory, `${ inputName }.less`);
  //判断组件文件夹是否存在
  const hasComponentDirectory = fs.existsSync(componentDirectory);
  if (hasComponentDirectory) {
    errorLog(`${ inputName }组件目录已存在,请重新输入`);
    return
  } else {
    log(`正在生成 component 目录 ${ componentDirectory }`);
    await dotExistDirectoryCreate(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(`正在生成 js 文件 ${ entryComponentName }`);
    await generateFile(entryComponentName, jsTemplate(componentName));
    log(`正在生成 less 文件 ${ componentStyleName }`);
    await generateFile(componentStyleName, lessTemplate(componentName));
    successLog('模板创建完成!请前往对应目录进行开发...');
  } catch (e) {
    errorLog(e.message)
  }
  process.stdin.emit('end')
});
process.stdin.on('end', () => {
  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();
    })
  }
}

 

viewsTemplateToods.js

const { vueInit } = require('./template/vueTemplate');
const { jsInit } = require('./template/jsTemplate');

exports.vueTemplate = compoenntName => {
  return vueInit(compoenntName)
};

exports.jsTemplate = compoenntName => {
  return jsInit(compoenntName)
};

exports.lessTemplate = compoenntName => {
  return `.${ compoenntName } {
  
}
`
};

template/vueTemplate.js

exports.vueInit = compoenntName => {
    return `<style lang="less" scoped>
    @import "./${ compoenntName }.less";
  </style>
  <template>
    <div class="${ compoenntName }">
      这是${ compoenntName }组件
    </div>
  </template>
  <script src="./${ compoenntName }.js"></script>
  `
  };
  

template/jsTemplate.js

exports.jsInit = compoenntName => {
    return `export default {
    name: '${ compoenntName }',
    components: {},
    data(){
      return {
        
      }
    },
    computed: {},
    methods:{
      main() {
        
      }
    },
    created(){
  
    }
  }
  `
  };

3.配置package.json

4.控制台生成

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值