前端工程化- 实现简易 CLI

简介: 前端工程化- 实现简易 CLI

创建工程

  • 初始化

    mkdir kkb-vue-auto-router-cli
    cd kkb-vue-auto-router-cli
    npm init -y
    npm i commander download-git-repo ora handlebars figlet clear chalk open -s
  • 设置启动入口
    bin/kkb.js

    #!/usr/bin/env node
    console.log('cli....');

    package.json

    "bin": {
      "kkb": "./bin/kkb.js"
    }
  • 将npm 模块链接到对应的运⾏项⽬目中去,相当于设置全局命令或全局安装

    npm link
    
    # 安装完成测试
    kkb # 输出 cli...

定制命令行界面

  • 初始化交互
    kkb.js

    #!/usr/bin/env node
    const program = require('commander');
    program.version(require('../package').version);
    
    program
      .command('init <name>')
      .description('init project')
      .action(name => {
        console.log(`init ${name}`);
      });
    
    program.parse(process.argv);

    测试

    kkb init test-app
    # 输出 init test-app
  • 将初始化模块化,并制作欢迎界面
    lib/init.js

    const { promisify } = require('util');
    const figlet = promisify(require('figlet'));
    const clear = require('clear');
    const chalk = require('chalk');
    const log = content => console.log(chalk.green(content));
    
    module.exports = async name =>  {
      clear();
      const data = await figlet('KKB Welcome');
      log(data);
    };

    kkb.js

    #!/usr/bin/env node
    const program = require('commander');
    program.version(require('../package').version);
    
    program
      .command('init <name>')
      .description('init project')
      .action(require('../lib/init'));
    
    program.parse(process.argv);

远程下载

  • 添加下载模块
    lib\download.js

    const { promisify } = require('util');
    
    const downloadGitRepo = require('download-git-repo');
    const ora = require('ora');
    
    module.exports.clone = async function(repo, desc) {
      const download = promisify(downloadGitRepo);
      const process = ora(`下载...${repo}`);
      process.start();
      await download(repo, desc);
      process.succeed();
    }
  • 下载模板
    lib\init.js

    const { promisify } = require('util');
    const figlet = promisify(require('figlet'));
    const clear = require('clear');
    const chalk = require('chalk');
    const log = content => console.log(chalk.green(content));
    const { clone } = require('./download');
    
    module.exports.init = async name =>  {
      // 欢迎界面
      clear();
      const data = await figlet('KKB Welcome');
      log(data);
      // 下载模板
      await clone('github:cellinlab/vue-template', name);
    };
  • 测试

    kkb init testapp

安装依赖

lib/init.js

// ...
module.exports.init = async name =>  {
  // ...

  // 安装依赖
  log('安装依赖');
  await spawn(process.platform === 'win32' ? 'npm.cmd' : 'npm', ['install'], { cwd: `./${name}` });
  log(chalk.green(`
安装完成:
To get Start:
===========================
cd ${name}
npm run serve
===========================
 `))
};

// 对接输出流
const spawn = async (...args) => {
  const { spawn } = require('child_process');
  return new Promise((resolve, reject) => {
    const proc = spawn(...args);
    proc.stdout.pipe(process.stdout);
    proc.stderr.pipe(process.stderr);
    proc.on('close', () => {
      resolve();
    });
  });
};

自动启动

lib/init.js

const open = require('open');

module.exports.init = async name =>  {
  // ...

  // 启动项目
  open(`http://localhost:8080`);
  await spawn(process.platform === 'win32' ? 'npm.cmd' : 'npm', ['run', 'serve'], { cwd: `./${name}` });
};

约定路由

  • 生成文件
    lib/refresh.js

    const fs = require('fs');
    const handlebars = require('handlebars');
    const chalk = require('chalk');
    
    module.exports = async () => {
      // 获取页面列表
      const list = fs.readdirSync('./src/views')
        .filter(fname => fname !== 'Home.vue')
        .map(fname => ({
          name: fname.replace('.vue', '').toLowerCase(),
          file: fname,
        }));
      
      // 生成路由
      compile({
        list,
      }, './src/router.js', './template/router.js.hbs');
    
      // 生成菜单
      compile({
        list,
      }, './src/App.vue', './template/App.vue.hbs');
    
      /**
       * 编译模板文件
       * @param {*} meta 
       * @param {*} filePath 
       * @param {*} templatePath 
       */
      function compile(meta, filePath, templatePath) {
        if (fs.existsSync(templatePath)) {
          const content = fs.readFileSync(templatePath).toString();
          const result = handlebars.compile(content)(meta);
          fs.writeFileSync(filePath, result);
        }
        console.log(chalk.green(`${filePath} 创建成功`));
      }
    };
    
  • 自动刷新
    bin/kkb.js

    #!/usr/bin/env node
    const program = require('commander');
    // ...
    program
      .command('refresh')
      .description('refresh project')
      .action(require('../lib/refresh'));
    
    program.parse(process.argv);

发布 npm

  • 新建发布脚本
    publish.sh

    #!/usr/bin/env bash
    npm config get registry
    npm config set registry=http://registry.npmjs.org
    echo "请进行登录操作:"
    npm login
    echo "---publishing---"
    npm publish
    npm config set registry=https://registry.npm.taobao.org
    echo "发布完成"
    exit
  • 发布

    ./publish.sh # win
相关文章
|
6天前
|
资源调度 前端开发 测试技术
前端工程化实践:从零搭建现代化项目构建流程
【4月更文挑战第6天】本文介绍了前端工程化的概念和重要性,包括模块化、自动化、规范化和CI/CD。接着,讨论了选择合适的工具链,如包管理器、构建工具和测试框架。然后,详细阐述了如何从零开始搭建一个基于React的现代化项目构建流程,涉及初始化、代码规范、测试、CSS处理、代码分割和CI/CD配置。最后,提到了持续优化与迭代的方向,如性能优化、类型检查和微前端。通过这样的实践,开发者可以提升开发效率和代码质量,为项目长远发展奠定基础。
45 0
|
6天前
|
前端开发 测试技术 持续交付
版本控制和团队协作:前端工程化的关键要素
版本控制和团队协作:前端工程化的关键要素
|
6天前
|
前端开发 JavaScript 测试技术
探索现代前端工程化工具与流程:提升开发效率和项目质量
探索现代前端工程化工具与流程:提升开发效率和项目质量
探索现代前端工程化工具与流程:提升开发效率和项目质量
|
6天前
|
前端开发
构建工具对比:Webpack与Rollup的前端工程化实践
在现代前端开发中,前端工程化变得愈发重要。本文将对两个常用的构建工具——Webpack和Rollup进行比较,探讨它们在前端工程化实践中的特点、优势和适用场景。无论是大型应用的打包优化还是轻量级库的构建,选择适合的构建工具都能提高开发效率和项目性能。
29 1
|
6天前
|
自然语言处理 前端开发 测试技术
前端工程化最佳实践:项目结构、代码规范和文档管理
前端工程化最佳实践:项目结构、代码规范和文档管理
|
4天前
|
前端开发 JavaScript API
前端工程化-babel、corejs、postcss
前端工程化-babel、corejs、postcss
8 0
|
6天前
|
前端开发 JavaScript 开发者
【专栏】前端工程化的重要性,强调构建工具在其中的角色,如Webpack和Rollup
【4月更文挑战第27天】本文探讨了前端工程化的重要性,强调构建工具在其中的角色,如Webpack和Rollup。Webpack以其灵活性和插件系统适用于复杂SPA项目,建议开发者理解其核心概念并优化性能。Rollup则专注于JavaScript模块打包,生成更小、更快的代码,适合小型至中型项目和库创建,以其Tree-shaking技术减小代码体积。开发者应根据项目需求、团队技术和生态选择合适工具,掌握核心原理以提升开发效率和质量。
|
6天前
|
监控 前端开发 小程序
微信小程序全栈开发中的前端工程化实践
【4月更文挑战第12天】本文探讨了微信小程序全栈开发中的前端工程化实践,旨在提升开发效率和体验。重点包括代码规范与架构设计(模块化、组件化、MVC模式)、自动化构建与部署(使用Webpack、Git和CI工具)、前端框架与库(如Vue.js、React、Angular)以及性能优化策略(代码、资源优化和性能监控)。通过这些实践,开发者能更高效地掌握小程序开发,打造高质量应用。
|
6天前
|
JavaScript 前端开发 C++
Javaweb之前端工程化的详细解析(2)
3.2.2.3 运行vue项目 那么vue项目开发好了,我们应该怎么运行vue项目呢?主要提供了2种方式 第一种方式:通过VS Code提供的图形化界面 ,如下图所示:(注意:NPM脚本窗口默认不显示,可以参考本节的最后调试出来)
56 0
|
6天前
|
存储 JavaScript 前端开发
Javaweb之前端工程化的详细解析(1)
3 前端工程化 3.1 前端工程化介绍 我们目前的前端开发中,当我们需要使用一些资源时,例如:vue.js,和axios.js文件,都是直接再工程中导入的,如下图所示:
53 0