- 需求:
- 1. elementUI (nodejs脚本)
- element-plus (shell脚本)">2. element-plus (shell脚本)
- 分析:
- 实现
需求:
npm run gen Hello
指令生成Hello.vue、hello.scss,并在相应文件中添加
场景:
- 组件库的开发
1. elementUI (nodejs脚本)
https://github.com/ElemeFE/element/blob/dev/build/bin/new.js
插件 file-save (封装fs模块, 链式调用代替回调)
2. element-plus (shell脚本)
https://github.com/element-plus/element-plus/blob/dev/scripts/gc.sh
"gen": "bash ./scripts/gc.sh"
分析:
新文件, 创建
旧文件, 读取-修改-重写入
实现
console.log();process.on('exit', () => {console.log();});if (!process.argv[2]) {console.error('[组件名]必填 - Please enter new component name');process.exit(1);}const path = require('path');const fs = require('fs');const fileSave = require('file-save');const uppercamelcase = require('uppercamelcase');const componentname = process.argv[2];const chineseName = process.argv[3] || componentname;const ComponentName = uppercamelcase(componentname);const PackagePath = path.resolve(__dirname, '../../packages', componentname);const Files = [{filename: 'index.js',content: `import ${ComponentName} from './src/main';/* istanbul ignore next */${ComponentName}.install = function(Vue) {Vue.component(${ComponentName}.name, ${ComponentName});};export default ${ComponentName};`},{filename: 'src/main.vue',content: `<template><div class="el-${componentname}"></div></template><script>export default {name: 'El${ComponentName}'};</script>`},{filename: path.join('../../examples/docs/zh-CN', `${componentname}.md`),content: `## ${ComponentName} ${chineseName}`},{filename: path.join('../../examples/docs/en-US', `${componentname}.md`),content: `## ${ComponentName}`},{filename: path.join('../../examples/docs/es', `${componentname}.md`),content: `## ${ComponentName}`},{filename: path.join('../../examples/docs/fr-FR', `${componentname}.md`),content: `## ${ComponentName}`},{filename: path.join('../../test/unit/specs', `${componentname}.spec.js`),content: `import { createTest, destroyVM } from '../util';import ${ComponentName} from 'packages/${componentname}';describe('${ComponentName}', () => {let vm;afterEach(() => {destroyVM(vm);});it('create', () => {vm = createTest(${ComponentName}, true);expect(vm.$el).to.exist;});});`},{filename: path.join('../../packages/theme-chalk/src', `${componentname}.scss`),content: `@import "mixins/mixins";@import "common/var";@include b(${componentname}) {}`},{filename: path.join('../../types', `${componentname}.d.ts`),content: `import { ElementUIComponent } from './component'/** ${ComponentName} Component */export declare class El${ComponentName} extends ElementUIComponent {}`}];// 添加到 components.jsonconst componentsFile = require('../../components.json');if (componentsFile[componentname]) {console.error(`${componentname} 已存在.`);process.exit(1);}componentsFile[componentname] = `./packages/${componentname}/index.js`;fileSave(path.join(__dirname, '../../components.json')).write(JSON.stringify(componentsFile, null, ' '), 'utf8').end('\n');// 添加到 index.scssconst sassPath = path.join(__dirname, '../../packages/theme-chalk/src/index.scss');const sassImportText = `${fs.readFileSync(sassPath)}@import "./${componentname}.scss";`;fileSave(sassPath).write(sassImportText, 'utf8').end('\n');// 添加到 element-ui.d.tsconst elementTsPath = path.join(__dirname, '../../types/element-ui.d.ts');let elementTsText = `${fs.readFileSync(elementTsPath)}/** ${ComponentName} Component */export class ${ComponentName} extends El${ComponentName} {}`;const index = elementTsText.indexOf('export') - 1;const importString = `import { El${ComponentName} } from './${componentname}'`;elementTsText = elementTsText.slice(0, index) + importString + '\n' + elementTsText.slice(index);fileSave(elementTsPath).write(elementTsText, 'utf8').end('\n');// 创建 packageFiles.forEach(file => {fileSave(path.join(PackagePath, file.filename)).write(file.content, 'utf8').end('\n');});// 添加到 nav.config.jsonconst navConfigFile = require('../../examples/nav.config.json');Object.keys(navConfigFile).forEach(lang => {let groups = navConfigFile[lang][4].groups;groups[groups.length - 1].list.push({path: `/${componentname}`,title: lang === 'zh-CN' && componentname !== chineseName? `${ComponentName} ${chineseName}`: ComponentName});});fileSave(path.join(__dirname, '../../examples/nav.config.json')).write(JSON.stringify(navConfigFile, null, ' '), 'utf8').end('\n');console.log('DONE!');
