npm入手筆記0x003-一些常見問題記錄

0x001 概述

本篇文章承接上文,記錄的是一些使用過程當中的疑惑node

0x001 牆的緣由使得包下載太慢

解決方案:使用淘寶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

0x002 沒法安裝全局包,提示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

0x003 全局包和本地包的區別以及如何抉擇

本質上是沒有差異的,只是一個裝在了全局文件夾,一個裝在了項目文件夾。全局文件夾中的包處處均可以引用,而裝在項目文件夾中的包只有該項目才能夠引用(其實均可以引用),如下作實驗來演示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.0gulp

$ 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
  1. 安裝並引用@followwinter/0x007-local-global-diff1@1.0.0vim

$ 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`文件夾

可是均可以找到就是,主要是查找路徑和順序的問題,而關於如何抉擇存在哪呢?考慮的問題有一下幾點

  • 是否在乎全局文件的佔用問題,全局文件不手動刪除會一直存在,佔用磁盤空間

  • 是否在多個項目使用不一樣版本?版本之間還有衝突?若是是這樣,推薦仍是保存在本地

  • 是否有命令行功能?若是有推薦安裝在全局,由於安裝本地調用須要調整調用路徑,很麻煩

0x004 dependenciesdependencies-dev節點的區別以及如何抉擇

區別:沒有啥區別,只有語義上的區別,dependencies通常說的是項目運行須要的包,或者說須要打包進生產環境的包,好比jQuerylodash之類,而dependencies-dev通常說的是開發須要用的包,好比webpackgulp之類,在生產環境中不須要打包。
如何選擇就若是上面全部,須要打包進生產環境就保存到dependencies,只是在開發或者打包的時候使用的就保存到dependencies-dev便可。

0x005 提示不能發佈當前版本

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

解決方案:不能發佈已經發布的版本,修改一下版本號就能夠了

0x006 想不到了,想到了再寫

0x007 資源

相關文章
相關標籤/搜索