當(dāng)前在移動(dòng)端開發(fā)多個(gè)典型問題的系統(tǒng)解決方案中,常常用nodejs來幫助開發(fā)一套輔助工具,以便于使用或者調(diào)試。
我們在建設(shè)應(yīng)用發(fā)布平臺(熱修復(fù)平臺)的過程中,即用nodejs開發(fā)了一套apub工具(類似于快應(yīng)用的hap-toolkit工具鏈),將本地編譯輸出結(jié)果,生成下載鏈接,以二維碼的方式提供掃碼下載。
移動(dòng)開發(fā)的一些典型問題(如:熱修復(fù)問題、H5加速問題),除了應(yīng)該有高效、核心的系統(tǒng)解決方案,還應(yīng)該提供方便的工具鏈,以提升使用及開發(fā)效率。
一、如何讓npm安裝時(shí)將此命令安裝到系統(tǒng)路徑?
在項(xiàng)目的package.json中,創(chuàng)建“bin”這個(gè)key, 然后你要聲明的命令及加載執(zhí)行文件的路徑,如:

基中, "apub"就是我的命令名稱,“bin/apub”,會在當(dāng)前項(xiàng)目的bin目錄下尋找apub這個(gè)文件。當(dāng)然這里的目錄和名字都可你自己定義。
當(dāng)我執(zhí)行npm install完成安裝后,apub會被安裝到系統(tǒng)nodejs的一個(gè)bin目錄下(這個(gè)目錄已被聲明到$PATH變量),我們就可在命令行中使用它了。
我的項(xiàng)目下bin目錄的內(nèi)容:

其中bin/apub只是引用相同目錄下的index.js:
#!/usr/bin/env node
require('./index.js');
關(guān)于package.json文件的更多配置項(xiàng)說明可參考:https://docs.npmjs.com/files/package.json#bin
二、如何解析命令行參數(shù)?
這里推薦commander這個(gè)解析庫,自己去寫還是要花很多時(shí)間的。這個(gè)庫提供了非常方便地添加參數(shù)并解析的方式。
const program = require('commander')
const chalk = require('chalk')
program
.version(require('../package').version, '-v, --version')
.usage('<command> [options]')
program
.command('server <file>')
.description('create http server to allow downloading a file by scanning qr-code')
.action((name, cmd) => {
let apubServer = require('../lib/command/server')
apubServer.onServer(name) // 此處根據(jù)傳入?yún)?shù)解析結(jié)果,將執(zhí)行轉(zhuǎn)到了onServer這個(gè)方法
})
program.on('--help', () => {
console.log()
console.log(` Run ${chalk.cyan(`apub <command> --help`)} for detailed usage of given command.`)
console.log()
})
program.parse(process.argv)
文中chalk庫,能夠?qū)敵龅綐?biāo)準(zhǔn)輸出的文字定制樣式。
三、如何將內(nèi)容生成二維碼?
這里用到了qrcode-terminal這個(gè)庫,將需要供掃碼下載的文件,提供局域網(wǎng)內(nèi)下載服務(wù),將下載鏈接生成二維碼打印即可:
const qrcodeTerminal = require('qrcode-terminal')
console.log(`\n${chalk.white("文件下載地址:" + downloadUrl)}`)
qrcodeTerminal.generate(downloadUrl) // 生成并打印二維碼