编写的一个脚手架(或组件)可以发布为npm包来让其它项目使用。
以@mosfe/beam为例,发布一个npm包大概需要以下几步:
发布npm包
1、编写脚手架内容和入口文件
写好一个脚手架或组件,新建一个index.js文件作为该组件的入口文件。
index.js 可以作为组件的唯一入口,即package.json main属性对应的值。在安装该npm包后会先执行index.js文件。代码如下:
index.js
module.exports = require('./lib/bone');
./lib/bone.js
/**
** 注册全局属性bone
**/
const path = require('path');
const bonePackage = require('../package.json');
...
const bone = module.exports = {};
bone.name = bonePackage.name;
...
// register global variable
Object.defineProperty(global, 'bone', {
enumerable: true,
writable: false,
value: bone
});
...
bone['cli'] = require(path.join(__dirname, 'cli'));
2、配置bin命令。
如果是工具类npm包,则需要配置bin命令来供其它项目调用。如vue-cli配置的bin命令为:vue-cli-serve,其它项目即可直接调用vue-cli-serve命令。
package.json中配置bin如下:
"bin": {
"beam": "./bin/bone"
}
其中./bin/bone.js
const { cli } = bone;
cli.run();
/* 给 beam 添加注册命令行选项或指令 */
cli.run = () => {
// 添加注册查看版本选项
program
.option('-v, --version')
.version(JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf8')).version);
}
// 给 beam 添加注册指令 init <app-name>
program
.command('init <app-name>')
.description('init project')
.option('-c, --current <current>', 'create project in current directory, equivalent to <app-name> is . (beam init .)')
.action(async(name, cmd) => {
......
}
// 给 beam 添加注册指令 list
program
.command('list')
.description('list available beam templates')
.action(async() => {
const list = ['name0', 'name1'];
console.log('list 如下:' + list);
}
上面的配置即表示该npm包对外配置了一个命令beam,调用beam命令相当于执行./bin/bone.js文件内容。
3、执行npm init
初始化生成package.json,设置好main:index.js;bin:{ “beam”: ‘./bin/bone’ }的配置关系。
4、执行npm adduser 注册npm用户
分官网注册和npm命令注册两种方式。
官网注册直接按提示注册用户名密码即可。
npm命令注册:npm adduser
5、执行npm login登录npm
6、执行npm publish 发布包
更新发布npm包时,先修改package.json中version,再执行npm publish发布。
其它详见:手把手教你用npm发布包
关于bin
package.json中的bin配置了一组命令:文件的映射关系,来对外提供执行该npm包相关功能的命令。其依据是:
该软连接就是一个文件,文件名为beam,文件内容为beam对应的js文件。