创建简单的npm脚手架

举报
且听风吟 发表于 2019/11/03 19:58:44 2019/11/03
【摘要】 前言vue-cli, webpack-cli 等脚手架是不是用起来爱不释手?自己写了个模版每次来回复制粘贴代码是不是很难维护?如果你是对前端、Node操作有一定的了解,同时也存在以上疑问,那就请尽情阅读尝试吧!本篇文章按照al-block-cli举例, al-block-cli是一个基于vue和elementUI而集成的一个开发模版,可安装进行使用。依赖Commander.js 命令行工具d...

前言

vue-cli, webpack-cli 等脚手架是不是用起来爱不释手?自己写了个模版每次来回复制粘贴代码是不是很难维护?如果你是对前端、Node操作有一定的了解,同时也存在以上疑问,那就请尽情阅读尝试吧!

本篇文章按照al-block-cli举例, al-block-cli是一个基于vueelementUI而集成的一个开发模版,可安装进行使用。

依赖

  1. Commander.js 命令行工具

  2. download-git-repo git仓库代码下载

  3. chalk 命令行输出样式美化

  4. Inquirer.js 命令行交互

  5. ora 命令行加载中效果

根据上方的依赖插件即可以看出,其实脚手架就是一个利用终端命令将仓库中的代码拉取到本地的工具。所以还没有模版代码的同学赶紧去创建个吧。

项目准备

初始化

image.png

根据提示完成初始化搭建,如果不清楚如何配置可以直接回车

安装依赖


image.png


构建结构

创建bincommands文件夹以及配置文件templates.json。bin文件夹为可执行命令入口目录,commands则负责编写一些命令交互

最终目录结构

image.png

编写代码

配置文件

输入默认需要的配置,如这里需要github的仓库地址和命令行的名称:

image.png

入口文件

新建al-block-cli文件,并在其第一行加入:

image.png

此行为了防止操作系统用户没有将node装在默认的/usr/bin路径里。当系统看到这一行的时候,首先会到env设置里查找node的安装路径,再调用对应路径下的解释器程序完成操作。

image.png

命令交互

新建init.js文件表示命令init

const { prompt } = require('inquirer');
const program = require('commander');
const chalk = require('chalk');
const download = require('download-git-repo');
const ora = require('ora');
const fs = require('fs');

const option =  program.parse(process.argv).args[0];
const question = [
  {
    type'input',
    name'name',
    message'Project name',
    defaulttypeof option === 'string' ? option : 'al-block-template',
    filter (val) {
      return val.trim()
    },
    validate (val) {
      const validate = (val.trim().split(" ")).length === 1;
      return validate || 'Project name is not allowed to have spaces ';
    },
    transformer (val) {
      return val;
    }
  },
  {
    type'input',
    name'description',
    message'Project description',
    default'Vue project',
    validate () {
      return true;
    },
    transformer(val) {
      return val;
    }
  },
  {
    type'input',
    name'author',
    message'Author',
    default'',
    validate () {
      return true;
    },
    transformer(val) {
      return val;
    }
  }
];

module.exports = prompt(question).then(({name, description, author}) => {
  const gitPlace = require('../templates').init.path;
  const projectName = name;
  const spinner = ora('Downloading please wait...');

  spinner.start();
  download(`${gitPlace}``./${projectName}`, (err) => {
    if (err) {
      console.log(chalk.red(err));
      process.exit()
    }

    fs.readFile(`./${projectName}/package.json`'utf8'function (err, data{
      if(err) {
        spinner.stop();
        console.error(err);
        return;
      }

      const packageJson = JSON.parse(data);
      packageJson.name = name;
      packageJson.description = description;
      packageJson.author = author;

      fs.writeFile(`./${projectName}/package.json`JSON.stringify(packageJson, null2), 'utf8'function (err{
        if(err) {
          spinner.stop();
          console.error(err);
        } else {
          spinner.stop();
          console.log(chalk.green('project init successfully!'))
          console.log(`
            ${chalk.yellow(`cd ${name}`)}
            ${chalk.yellow('npm install')}
            ${chalk.yellow('npm run dev')}
          `
);
        }
      });
    });
  })
});

测试发布

测试

至此,一个简单的脚手架(壳)就已经完成了,为了查看在编写过程中是否出错,我们现在本地进行测试

$ node bin/al-block-cli

如果没有报错,出现了熟悉的命令行,那就说明成功了

发布

发布之前我们需要做个小调整,观察其他脚手架工具他们都是以自己独特的key值进行搭建,对此我们可以在package.json里面配置bin对象

image.png

这里需要注意bin/后面的al-block-cli,这个路径是由入口文件的路径确定,如果你是建的al-block-cli.js;则此处应该配置bin/al-block-cli.js,本篇是创建的没有后缀名的文件。

修改后生成的最终package.json

image.png

对比文件内容,如果没有问题我们就开始发布了

image.png

至此,恭喜你,简单的npm脚手架已经创建成功!


本文转载自微信公众号【java学习之道】。

原文链接:https://mp.weixin.qq.com/s?__biz=MzU4NzYwNDAwMg==&mid=2247484726&idx=2&sn=ab74f51e68a004ace8633c20c15e1695&chksm=fde8cc7bca9f456dcfed714aeea415106519386d7c15f620bc5504d2664c1fc7de63c84390af&scene=0#rd

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。