前端脚手架开发

188 阅读2分钟

前置知识

  1. npm link
  2. 终端如何识别指令?

npm link

官网说明

  • 使用场景:开发npm包时将包(模块)链接到全局,或者链接到项目.
  • 优点:npm link能够避免重复且繁琐的打包发布操作
  • 使用:例如开发公共组件commonA,在项目Project中使用,只有当发布到npm之后,在项目Project执行npm install commonA才可以使用,如果想解决频繁打包,发包问题,分两步操作:
  1. cd到commonA目录下执行npm link(此步骤是将当前包链接到全局包路径下)
  2. cd到Project目录下执行npm link CommonA(此步骤是生成一个从全局包指向当前目录node_modules/下对应包的链接),此时项目Project就等同于安装了commonA这个包

终端如何识别自定义指令?

package.json 文件中的bin属性可以,用来定义自定义指令,例如安装commonA包,其package.json为:

{
	"name": "cli",
	"version": "1.0.0",
	"description": "",
	"main": "index.js",
	"bin": {
		"ljz": "index.js"
	}
}

如果全局安装npm会将该文件符号链接到前缀/bin中(全局安装),可输入该指令执行对应的文件,如果局部项目安装,项目/node_modules/.bin/中有对应的可执行指令,输入执行指向对应的文件

如何自定指令?

引入Commander

a.创建项目cli;b.初始化package.json;c.创建入口文件index.js;d.在index.js 中头部定义执行脚本 #!/usr/bin/env node(查找系统中node,执行后续代码);e.安装插件npm install commander f. 自定义指令: 项目目录结构:

image.png index.js 文件代码:

#!/usr/bin/env node
const { program } = require("commander");
const { helpOptions } = require("./lib/core/help");
// 查看版本号
program.version(require("./package.json").version);
// 帮助和可选信息
helpOptions();
program.parse(process.argv);

help.js 文件代码(抽离出来的一些自定义指令):

const { program } = require("commander");
const helpOptions = () => {
	// 增加自定义option
	program.option("-l --ljz", "ljz cli");
	program.option("-d --dest <dest>", "a destination folder, 例如: -d /cli/src/components");
	program.on("--help", function () {
		console.log("others:");
		console.log("我是一些其他帮助描述");
	});
	program.parse(process.argv);

	console.log(program.opts().dest);
};
module.exports = {
	helpOptions,
};

指令调用展示:

image.png

如何通过自定义指令xxx create demo,创建项目模板

  1. 自定义create命令
  program
        .command("create <project> [others...]")
        .description("clone a repository into a folder")
        .action(createProjectActions);
  1. 克隆项目
  • 安装:npm install download-git-repo
  • 指定clone地址:const webpackRepo = "direct:https://github.com/zhuzi002/webpack.git";
  • 克隆项目:await download(webpackRepo,project,{clone:true});
  1. npm install
  • 开启新的进程const {exec,spawn} = require('child_process');
  • 封装执行终端命令方法
const commandSpawn = (...args) => {
	spawn(...args);
};
  • 主进程打印子进程终端输出信息
    childProcess.stdout.pipe(process.stdout);
    childProcess.stderr.pipe(process.stderr);
  • 执行npm install
    const command = process.platform === "win32" ? "npm.cmd" : "npm";
    await commandSpawn(command, ["install"], { cwd: `./${project}` });
  1. 运行项目
await commandSpawn(command, ["run", "serve"], { cwd: `./${project}` });

项目git传送门:gitee.com/liujiazhu/l…