这么讲吧,没发布过 npm 包的前端,不是好前端。那一个包写好之后,如何发布呢?大部分人会直接运行下面的命令:
$ npm publish
太简单粗暴了,而且容易出问题,因为你可能不知道到底哪些文件被打包进去了,所以我建议大家在发包之前,务必先运行下面的语句查看哪些文件被包含进去了:
$ npm publish --dry-run
npm notice
npm notice 📦 package_name@1.0.0
npm notice === Tarball Contents ===
npm notice 1.1kB index.js
npm notice 327B package.json
npm notice 719B index.d.ts
npm notice === Tarball Details ===
npm notice name: package_name
npm notice version: 1.0.0
npm notice package size: 935 B
npm notice unpacked size: 2.1 kB
npm notice shasum: 4227f6f34876ef071f2127df369e681d
npm notice integrity: sha512-ug/t3R8zCB+PbkU70XhGA==
npm notice total files: 3
如果觉得命令行不直观,也可以用下面的语句直接打包成 .tgz 文件:
$ npm pack
注意该命令并不会发布到服务器,只会生成本地压缩包,所以可以放心使用。
其实大部分的工程项目,在发包的时候,不是直接把源代码上传就好了的,例如源文件一般在 lib 或 src 目录下,但生成的文件一般在 dist 或 build 目录下,而我们会把这个构建目录在 .gitignore 中给忽略掉,导致发包之后也看不到,这是不对的。那怎么办呢?此时有两种办法:
- 增加
.npmignore文件,把忽略的文件写在这里,因为默认情况下,npm 打包会根据.gitignore来忽略文件,如果发现存在.npmignore的话,则使用这个文件。 - 在 package.json 中增加
files数组,把需要打包的文件写在这里,那么 npm 打包的时候只会按照你列出来的规则添加文件。它的优先级高于.npmignore和.gitignore,且支持通配符。
有时候,我们只想把 dist 目录生成的文件打包上传,并不想提供源代码,因为源代码会增加下载体积;或者我们是用 TypeScript 写的,发包的时候只发编译过的 JavaScript 文件和 d.ts 声明文件。此时只需要把 package.json 拷贝一份到 dist 目录,然后在该目录下运行 npm publish 即可。为了防止搞混且误提交,可以在源代码中的 package.json 添加 private: true 字段,而在 dist 的 package.json 中去掉该字段。