編寫的一個腳手架(或組件)可以發佈爲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文件。