1. 创建普通 module

创建 ./lib/index.js 文件,内容如下

module.exports.sayHello = sayHello

function sayHello(name){
  console.log(`Hello ${name}!`)
}

npm init 创建 package.json ,main entry 指向 .lib/index.js

注意虽然之后要创建的是 global module,但其实并没有硬性的区分,此处 main entry 指向的代码仍然能够作为普通 module 被引用。

{
  "name": "poc-nodejs-global-module",
  "version": "1.0.0",
  "description": "",
  "main": "./lib/index.js",
  "author": "",
  "license": "ISC"
}

有了 package.json ,它就不再只是一个 node.js 的 module,它还是一个 npm 的 package。前一篇《创建 Node.js module》里介绍了如何创建 module 然后直接 require('module-filename.js') 引用,npm package 呢则可以 npm install 然后直接 require('package-name') 引用。

所以这篇文章的标题是否应该是「创建 npm global package」?然后,npm 既是 Node.js 的 package manager 这个整体概念,也是本地的命令行工具和线上发布 package 的代码库。所以算了,能凑合着讲明白就行。

2. 创建 global module

创建 ./bin/global-hello.js ,内容如下

#!/usr/bin/env node

let lib = require('../lib/index.js')
let name = process.argv[2]
lib.sayHello(name)

修改 package.json,添加 bin 部分

{
  "name": "poc-nodejs-global-module",
  "version": "1.0.0",
  "description": "",
  "main": "./lib/index.js",
  "bin": {
    "cmd-global-hello": "./bin/global-hello.js"
  },
  "author": "",
  "license": "ISC"
}

name 是 package 的名称,也就是 npm list 返回结果中显示的那个,bin 设置的是安装后可以在命令行中执行的指令,可以指定多个,所以两者不一定是一样的,需要注意。

3. 安装和使用

切换到代码所在目录进行安装

npm install -g .

调用安装好的 global module

cmd-global-hello World

如果你的 package 有些确实的用处,接下来可以考虑发布到 npm 线上仓库。

简历里写一条「npm XXX package 创始人」有时应该也能对某些人制造些不明觉厉的效果,嗯……