npm 发包技巧

2,729 阅读2分钟

这么讲吧,没发布过 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

注意该命令并不会发布到服务器,只会生成本地压缩包,所以可以放心使用。

其实大部分的工程项目,在发包的时候,不是直接把源代码上传就好了的,例如源文件一般在 libsrc 目录下,但生成的文件一般在 distbuild 目录下,而我们会把这个构建目录在 .gitignore 中给忽略掉,导致发包之后也看不到,这是不对的。那怎么办呢?此时有两种办法:

  1. 增加 .npmignore 文件,把忽略的文件写在这里,因为默认情况下,npm 打包会根据 .gitignore 来忽略文件,如果发现存在 .npmignore 的话,则使用这个文件。
  2. 在 package.json 中增加 files 数组,把需要打包的文件写在这里,那么 npm 打包的时候只会按照你列出来的规则添加文件。它的优先级高于 .npmignore.gitignore,且支持通配符。

有时候,我们只想把 dist 目录生成的文件打包上传,并不想提供源代码,因为源代码会增加下载体积;或者我们是用 TypeScript 写的,发包的时候只发编译过的 JavaScript 文件和 d.ts 声明文件。此时只需要把 package.json 拷贝一份到 dist 目录,然后在该目录下运行 npm publish 即可。为了防止搞混且误提交,可以在源代码中的 package.json 添加 private: true 字段,而在 dist 的 package.json 中去掉该字段。