本篇文章承接上文,記錄的是一些使用過程當中的疑惑node
解決方案:使用淘寶cnpm
,推薦使用cnpm
,由於若是修改npm
倉庫,將會致使沒法發佈包。webpack
$ npm install -g cnpm --registry=https://registry.npm.taobao.org /usr/local/bin/cnpm -> /usr/local/lib/node_modules/cnpm/bin/cnpm + cnpm@5.1.1 updated 4 packages in 10.035s $ cnpm install lodash
EACCES
,沒有權限解決方案:推薦第一種,簡單!git
第一種:給全局包安裝路徑權限github
$ npm config get prefix /usr/local $ sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
第二種:修改全局包安裝路徑到有權限的地方web
$ mkdir ~/.npm-global $ npm config set prefix '~/.npm-global' $ export PATH=~/.npm-global/bin:$PATH $ source ~/.profile
本質上是沒有差異的,只是一個裝在了全局文件夾,一個裝在了項目文件夾。全局文件夾中的包處處均可以引用,而裝在項目文件夾中的包只有該項目才能夠引用(其實均可以引用),如下作實驗來演示npm
新建文件夾0x007-local-global-diff1
,0x008-local-global-diff2
,0x009-local-global-diff3
,0x010-local-global-diff4
,而且使用命名空間作包名json
$ mkdir 0x007-local-global-diff1 $ mkdir 0x008-local-global-diff2 $ mkdir 0x009-local-global-diff3 $ mkdir 0x010-local-global-diff4
編寫併發布@followwinter/0x007-local-global-diff1@1.0.0
gulp
$ cd 0x007-local-global-diff1 $ npm init This utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sensible defaults. See `npm help json` for definitive documentation on these fields and exactly what they do. Use `npm install <pkg>` afterwards to install a package and save it as a dependency in the package.json file. Press ^C at any time to quit. package name: (0x007-local-global-diff1) @followwinter/0x007-local-global-diff1 version: (1.0.0) description: entry point: (index.js) test command: git repository: keywords: author: license: (ISC) About to write to /MY_PROJECT/PROJECT_OWN/NodeJS/npm/0x007-local-global-diff1/package.json: { "name": "@followwinter/0x007-local-global-diff1", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" } Is this ok? (yes) $ vim index.js // index.js exports.printMsg = function() { console.log("This is a message from the @followwinter/0x007-local-global-diff1@1.0.0 package"); } $ npm publish --access public + @followwinter/0x007-local-global-diff1@1.0.0
安裝並引用@followwinter/0x007-local-global-diff1@1.0.0
vim
$ cd 0x008-local-global-diff2 $ vim index.js $ npm install @followwinter/0x007-local-global-diff1 npm WARN saveError ENOENT: no such file or directory, open '/MY_PROJECT/PROJECT_OWN/NodeJS/npm/0x008-local-global-diff2/package.json' npm notice created a lockfile as package-lock.json. You should commit this file. npm WARN enoent ENOENT: no such file or directory, open '/MY_PROJECT/PROJECT_OWN/NodeJS/npm/0x008-local-global-diff2/package.json' npm WARN 0x008-local-global-diff2 No description npm WARN 0x008-local-global-diff2 No repository field. npm WARN 0x008-local-global-diff2 No README data npm WARN 0x008-local-global-diff2 No license field. + @followwinter/0x007-local-global-diff1@1.0.0 added 1 package in 2.361s $ vim index.js // index.js var myModule = require('@followwinter/0x007-local-global-diff1'); console.log(myModule); myModule.printMsg(); $ node index.js { printMsg: [Function] } This is a message from the @followwinter/0x007-local-global-diff1@1.0.0 package
更新@followwinter/0x007-local-global-diff1@1.0.0
版本segmentfault
$ cd 0x007-local-global-diff1/ $ vim index.js // index.js exports.printMsg = function() { console.log("This is a message from the @followwinter/0x007-local-global-diff1@1.0.2 package"); } $ vim package.js // package.js { "name": "@followwinter/0x007-local-global-diff1", "version": "1.0.2", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" } $ npm publish --access public + @followwinter/0x007-local-global-diff1@1.0.2
全局安裝新版本並引用
$ cd 0x009-local-global-diff3/ $ npm install @followwinter/0x007-local-global-diff1 -g + @followwinter/0x007-local-global-diff1@1.0.2 $ vim index.js // index.js var myModule = require('@followwinter/0x007-local-global-diff1'); console.log(myModule); myModule.printMsg(); $ node index.js { printMsg: [Function] } This is a message from the @followwinter/0x007-local-global-diff1@1.0.2 package
運行0x008-local-global-diff2
,驗證全局和本地的引用順序
$ cd 0x008-local-global-diff2 $ node index.js This is a message from the @followwinter/0x007-local-global-diff1@1.0.0 package
0x010引用0x008中的node_modules中的0x007
$ cd 0x010-local-global-diff4/ $ vim index.js // index.js var myModule = require('/MY_PROJECT/PROJECT_OWN/NodeJS/npm/0x008-local-global-diff2/node_modules/@followwinter/0x007-local-global-diff1'); console.log(myModule); myModule.printMsg(); $ node index.js { printMsg: [Function] } This is a message from the @followwinter/0x007-local-global-diff1@1.0.0 package
因此包的查找順序是
- 項目的`node_modules`文件夾 - 全局的`node_modules`文件夾
可是均可以找到就是,主要是查找路徑和順序的問題,而關於如何抉擇存在哪呢?考慮的問題有一下幾點
是否在乎全局文件的佔用問題,全局文件不手動刪除會一直存在,佔用磁盤空間
是否在多個項目使用不一樣版本?版本之間還有衝突?若是是這樣,推薦仍是保存在本地
是否有命令行功能?若是有推薦安裝在全局,由於安裝本地調用須要調整調用路徑,很麻煩
dependencies
和dependencies-dev
節點的區別以及如何抉擇區別:沒有啥區別,只有語義上的區別,dependencies
通常說的是項目運行須要的包,或者說須要打包進生產環境的包,好比jQuery
、lodash
之類,而dependencies-dev
通常說的是開發須要用的包,好比webpack
、gulp
之類,在生產環境中不須要打包。
如何選擇就若是上面全部,須要打包進生產環境就保存到dependencies
,只是在開發或者打包的時候使用的就保存到dependencies-dev
便可。
npm ERR! publish Failed PUT 403 npm ERR! code E403 npm ERR! You cannot publish over the previously published version 1.0.2. : @followwinter/0x007-local-global-diff1 npm ERR! A complete log of this run can be found in: npm ERR! /Users/FollowWinter/.npm/_logs/2017-09-10T14_01_59_753Z-debug.log
解決方案:不能發佈已經發布的版本,修改一下版本號就能夠了