原文

node,npm在前端开发流程中提供了非常完善的自动化工具链,但是同样由于其复杂性导致有很多奇奇怪怪的问题。本文将记录使用过程中出现的一些问题及其解决方法备案。

  • 国内由于gfw问题,导致很多国外的网站不能访问,比如bitbucket就是一个host代码的很优秀平台,但是由于该平台可能被block住,从而导致npm安装时出现奇奇怪怪的问题。有以下方法解决:
1.使用一个proxy来代理访问,但是这个方法速度可能比较慢;
2.可以通过修改npm的配置文件让npm到另外的pacakge mirror站点去找package,通过如下命令
$
npm config set registry https://registry.npm.taobao.org
$ npm config set registry http://r.cnpmjs.org
或者:npm config set registry http://registry.npmjs.eu
随后再执行
npm install
或者直接在命令行中指定某些参数,比如phantomjs是一个无图形界面的浏览器,在自动化测试中应用广泛,可能的安装方式:
npm install phantomjs --phantomjs_cdnurl=http://cnpmjs.org/downloads
如果上述方法都不奏效,那么可能需要 配置自己网卡的dns为国外的dns
  • 如果你在企业防火墙的后面,上网是通过企业的代理来上的,那么需要配置proxy和https-proxy
npm config set proxy http://proxy.company.com:8080
npm config set https-proxy http://proxy.company.com:8080
  • 在linux下面,你可能需要使用-g参数安装一些package作为global,比如grunt,gulp,bower等,但是你又没有root权限,就有可能出现下面的错误:
$ npm install -g gulp
npm ERR! tar.unpack untar error /home/cabox/.npm/gulp/3.9.0/package.tgz
npm ERR! Linux 2.6.32-042stab104.1
npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "install" "-g" "gulp"
npm ERR! node v0.12.3
npm ERR! npm v2.9.1
npm ERR! path /usr/local/lib/node_modules/gulp
npm ERR! code EACCES
npm ERR! errno -13 npm ERR! Error: EACCES, mkdir '/usr/local/lib/node_modules/gulp'
npm ERR! at Error (native)
npm ERR! { [Error: EACCES, mkdir '/usr/local/lib/node_modules/gulp']
npm ERR! errno: -13,
npm ERR! code: 'EACCES',
npm ERR! path: '/usr/local/lib/node_modules/gulp',
npm ERR! fstream_type: 'Directory',
npm ERR! fstream_path: '/usr/local/lib/node_modules/gulp',
npm ERR! fstream_class: 'DirWriter',
npm ERR! fstream_stack:
npm ERR! [ '/usr/local/lib/node_modules/npm/node_modules/fstream/lib/dir-writer.js:36:23',
npm ERR! '/usr/local/lib/node_modules/npm/node_modules/mkdirp/index.js:46:53',
npm ERR! 'FSReqWrap.oncomplete (fs.js:95:15)' ] }
npm ERR!
npm ERR! Please try running this command again as root/Administrator. npm ERR! Please include the following file with any support request:
npm ERR! /home/cabox/npm-debug.log

可能的解决方案是修改npm将安装的目标目录的ownershipi:

$ npm config get prefix
/usr/local
$ whoami
cabox

上面的命令可以查到你是以cabox用户来运行命令的,npm将全局package安装package到/usr/local下面的lib/node_modules目录下面,比如gulp,bower,grunt等需要全局安装的node module都将存放到这里,而如果你对该目录没有写的权限,则会出现问题,因此你可以做的是chown -R /usr/local your_username

但是这个方案也是有缺点的,特别是当一个系统中有多个用户使用时,你把这些公共目录都搞成你自己的ownership,可能会存在问题。

另外一种可能的解决方案修改上述prefix,指定npm的全局package安装目录为自己的Home目录下面的子目录,同时需要将上述子目录放到path中去,这样就能够将npm的全局package安装到这个我们有权限控制的目录中了

$ npm config set prefix /home/cabox/npm-global/
$ npm config get prefix
/home/cabox/npm-global
$ gulp
-bash: gulp: command not found
$ npm install -g gulp
/home/cabox/npm-global/bin/gulp -> /home/cabox/npm-global/lib/node_modules/gulp/bin/gulp.js
gulp@3.9.0 /home/cabox/npm-global/lib/node_modules/gulp
├── pretty-hrtime@1.0.0
├── interpret@0.6.2
├── deprecated@0.0.1
├── archy@1.0.0
├── minimist@1.1.1
├── tildify@1.0.0 (user-home@1.1.1)
├── v8flags@2.0.5 (user-home@1.1.1)
├── chalk@1.0.0 (escape-string-regexp@1.0.3, ansi-styles@2.0.1, supports-color@1.3.1, strip-ansi@2.0.1, has-ansi@1.0.3)
├── semver@4.3.6
├── orchestrator@0.3.7 (stream-consume@0.1.0, sequencify@0.0.7, end-of-stream@0.1.5)
├── liftoff@2.1.0 (extend@2.0.1, rechoir@0.6.1, flagged-respawn@0.3.1, resolve@1.1.6, findup-sync@0.2.1)
├── gulp-util@3.0.5 (array-differ@1.0.0, array-uniq@1.0.2, lodash._reescape@3.0.0, lodash._reevaluate@3.0.0, beeper@1.1.0, lodash._reinterpolate@3.0.0, object-assign@2.1.1
, replace-ext@0.0.1, vinyl@0.4.6, lodash.template@3.6.1, through2@0.6.5, multipipe@0.1.2, dateformat@1.0.11)
└── vinyl-fs@0.3.13 (graceful-fs@3.0.8, strip-bom@1.0.0, defaults@1.0.2, vinyl@0.4.6, mkdirp@0.5.1, through2@0.6.5, glob-stream@3.1.18, glob-watcher@0.0.6)

上面使用cabox用户安装gulp到/home/cabox/npm-global目录中去了。

详细参照下面的两篇文章:

http://www.johnpapa.net/how-to-use-npm-global-without-sudo-on-osx/

https://github.com/sindresorhus/guides/blob/master/npm-global-without-sudo.md

但是现在还有一个问题,那就是系统path中并没有包含该目录,因此直接运行gulp还是无法找到的

在.bash_profile中添加以下:

PATH=$PATH:$HOME/bin:$HOME/npm-global/bin                                                                                                                                  
  • npm config ls 将列出所有已经配置好的npm选项 
  • 如果遇到一些莫名其妙的问题,你首先可以更新一下npm版本,删除npm的cache
    npm install -g npm@latest或npm install npm -g
    npm cache clear && rm -rf node_modules && npm install
  • npm ls 和 npm uninstal删除已安装的package. npm ls packagewitherror将列出有问题的那个package安装在哪里,这样你就可以直接到那个目录重新单独安装那个pacakge,调查不能安装成功的原因
    [cabox@box-codeanywhere npmtest]$ npm install --save lodash
    npm WARN package.json kidsit@1.0.0 No repository field.
    npm WARN package.json kidsit@1.0.0 No README data
    lodash@3.9.3 node_modules/lodash
    [cabox@box-codeanywhere npmtest]$ ls
    node_modules package.json
    [cabox@box-codeanywhere npmtest]$ vi package.json
    [cabox@box-codeanywhere npmtest]$ ls
    node_modules package.json
    [cabox@box-codeanywhere npmtest]$ npm ls
    kidsit@1.0.0 /home/cabox/workspace/npmtest
    └── lodash@3.9.3
    [cabox@box-codeanywhere npmtest]$ npm uninstall lodash --save
    unbuild lodash@3.9.3
    在这里如果node系统的模块安装有问题,这里会主动列出来:

    ├── camelcase@1.1.0
    ├─┬ cliui@2.1.0
    │ ├─┬ center-align@0.1.1
    │ │ └─┬ align-text@0.1.1
    │ │ ├── kind-of@1.1.0
    │ │ ├── longest@1.0.1
    │ │ └── repeat-string@1.5.2
    │ ├─┬ right-align@0.1.1
    │ │ └─┬ align-text@0.1.1
    │ │ ├── kind-of@1.1.0
    │ │ ├── longest@1.0.1
    │ │ └── repeat-string@1.5.2
    │ └── wordwrap@0.0.2
    ├── decamelize@1.0.0
    └── window-size@0.1.0

    npm ERR! missing: bytes@1.0.0, required by body-parser@1.12.4
    npm ERR! missing: content-type@~1.0.1, required by body-parser@1.12.4
    npm ERR! missing: depd@~1.0.1, required by body-parser@1.12.4
    npm ERR! missing: iconv-lite@0.4.8, required by body-parser@1.12.4
    npm ERR! missing: on-finished@~2.2.1, required by body-parser@1.12.4
    npm ERR! missing: qs@2.4.2, required by body-parser@1.12.4
    npm ERR! missing: raw-body@~2.0.1, required by body-parser@1.12.4
    npm ERR! missing: type-is@~1.6.2, required by body-parser@1.12.4

  • 如果你的node_modules目录中已经安装了一个package,但是package.json中并没有对该package做依赖,那么这个package就应该被删除。这时如果执行npm ls命令则指示有一个package not used。为了清理代码,你需要执行npm prune
    [cabox@box-codeanywhere npmtest]$ npm install lodash
    npm WARN package.json kidsit@1.0.0 No repository field.
    npm WARN package.json kidsit@1.0.0 No README data
    lodash@3.9.3 node_modules/lodash
    [cabox@box-codeanywhere npmtest]$ ls node_modules/
    lodash
    [cabox@box-codeanywhere npmtest]$ npm ls
    kidsit@1.0.0 /home/cabox/workspace/npmtest
    └── lodash@3.9.3 extraneous npm ERR! extraneous: lodash@3.9.3 /home/cabox/workspace/npmtest/node_modules/lodash
    [cabox@box-codeanywhere npmtest]$ npm prune
    npm WARN package.json kidsit@1.0.0 No repository field.
    npm WARN package.json kidsit@1.0.0 No README data
    unbuild lodash@3.9.3
    [cabox@box-codeanywhere npmtest]$ npm ls
    kidsit@1.0.0 /home/cabox/workspace/npmtest
    └── (empty)
  • npm ls -g --depth=0可以列出已经安装的全局package
    [cabox@box-codeanywhere npmtest]$ npm ls -g --depth=0
    /home/cabox/npm-global/lib
    ├── gulp@3.9.0
    └── npm@2.11.1 [cabox@box-codeanywhere npmtest]$ npm uninstall -g gulp
    unbuild gulp@3.9.0
    [cabox@box-codeanywhere npmtest]$ npm ls -g --depth=0
    /home/cabox/npm-global/lib
    └── npm@2.11.1
  • 为了publish一个package,你需要有以下流程: npm init创建一个package.json,创建入口js,比如index.js,exports相应接口,随后npm adduser, npm publish就可以了。如果要更新你的package,注意需要将版本号做一下变更(npm version patch,npm version minor, npm version major或者手动修改本package的package.json文件的版本号!),publish完成后,你可以在https://www.npmjs.com/~kidsit网页上查看是否确实publish了一个package。注意:npm package遵循semantic versioning method, major.minor.patch/patch表示bugfix,minor:表示new feature,major表示api无法保持兼容
    [cabox@box-codeanywhere npmtest]$ npm adduser
    Username: kidsit
    Password:
    Email: (this IS public) 1372921435@qq.com
    [cabox@box-codeanywhere npmtest]$ npm config ls
    ; cli configs
    user-agent = "npm/2.11.1 node/v0.10.28 linux x64" ; userconfig /home/cabox/.npmrc
    prefix = "/home/cabox/npm-global" ; node bin location = /usr/bin/node
    ; cwd = /home/cabox/workspace/npmtest
    ; HOME = /home/cabox
    ; 'npm config ls -l' to show all defaults. [cabox@box-codeanywhere npmtest]$ npm publish
    + kidsit@0.0.1
    [cabox@box-codeanywhere npmtest]$
  • http://blog.izs.me/post/1675072029/10-cool-things-you-probably-didnt-realize-npm

  • npm一般在哪些目录搜索需要require的模块呢?
    var utils = require( "utils" );
    上面的require命令将导致node按照以下顺序查找文件,注意不一定是index.js,这个由package.json中的main定义决定的
    ./node_modules/utils.js
    ./node_modules/utils/index.js
    ./node_modules/utils/package.json

    具体参考http://www.bennadel.com/blog/2169-where-does-node-js-and-require-look-for-modules.htm

  • 在windows host中的vagrant box linux中使用npm install时,由于host os不支持linux的symbol link,所以必须使用:npm install --no-bin-links命令,否则会出现
    info unbuild /home/nicholas/share/node_modules/yuitest
    verbose link symlinking /usr/local/lib/node_modules/yuitest to /home/nicholas/share/node_modules/yuitest
    ERR! Error: EPROTO, Protocol error '/usr/local/lib/node_modules/yuitest'
  • 在执行npm install时如果出现大量的EPERM错误时,很有可能是反病毒软件惹的祸!,同时有可能是npm cache clear没有执行,参考:http://blogs.msdn.com/b/matt-harrington/archive/2012/02/23/how-to-fix-node-js-npm-permission-problems.aspx
    Error: EPERM, operation not permitted 'C:\...\noam\node_modules\phantomjs\tmp\phantomjs-1.7.0-windows'
    at Object.fs.renameSync (fs.js:439:18)
  • gulp 是一个task runner,它和grunt的功能差不多,但是却比grant要快很多,它基于stream,pipe
  • 在win7,win10下安装npm install时,很有可能出现 error MSB3411: Could not load the Visual C++ component "VCBuild.exe". ...  的错误,一个可行的方案是:
npm config set msvs_version 2012 --global  

如何列出一个特定模块的依赖关系?

有时我们希望看清楚一个模块到底是因为谁被安装进来的,也就是说它是哪个package的依赖,你可以使用npm ll命令:

比如下面的命令npm -- gulp-less命令你就可以看出,原来gulp-less这个模块在laravel-elixir模块中包含而安装的,也就是说laravel-elixir已经包含了less预处理功能!

$ npm ll gulp-less
laravel-elixir@5.0.0
│ C:\Users\Administrator\devenvironment\Code\newkidsitfromscratch\node_modules\laravel-elixir
│ Laravel Elixir Core
│ git+https://github.com/laravel/elixir.git
│ https://github.com/laravel/elixir
└── gulp-less@3.1.0
Less for Gulp
git://github.com/plus3network/gulp-less.git
https://github.com/plus3network/gulp-less#readme

npm view gulp-less查看gup-less这个模块的meta信息

https://github.com/substack/stream-handbook

  • npm 命令大全参考: http://browsenpm.org/help
  • npm peerDependency问题:一个可行的思路是:首先升级npm3,然后再分析版本的依赖关系!
  • npm install安装时可能会涉及到phantomjs-2.1.1-windows.zip无法安装导致失败的问题,解决办法:手动下载phantomjs-1.9.7-windows.zip,复制到C:\Users\ADMINI~1\AppData\Local\Temp\phantomjs\目录,再次执行npm install mocha-phantomjs,安装成功 http://download.csdn.net/detail/f907279313/9575566
  • windows下如何平滑升级npm3?

参考这篇 https://github.com/felixrieseberg/npm-windows-upgrade 文章,写的非常详细,强烈建议升级到npm3,一些怪异的npm模块安装问题都会没有了!

windows下面的node-pre-gyp安裝依賴問題

 fsevents: AttributeError: 'MSVSProject' object has no attribute 'iteritems'

上述錯誤的原因是windows机器上没有安装build tooling依赖,解决办法是:

npm install --global --production windows-build-tools

参考: https://github.com/nodejs/node-gyp

我们如何向npm run script传入参数?

version=1 npm run build -- homepage

上面我们的build脚本就可以得到version和homepage这个参数

https://jurosh.com/blog/npm-pass-parameters-into-script

Nodejs的代码如何console.log查看object的值?

https://github.com/Silviu-Marian/node-codein

【转】npm使用过程中的一些错误解决办法及npm常用命令的更多相关文章

  1. npm使用过程中的一些错误解决办法及npm常用命令

    node,npm在前端开发流程中提供了非常完善的自动化工具链,但是同样由于其复杂性导致有很多奇奇怪怪的问题.本文将记录使用过程中出现的一些问题及其解决方法备案. 国内由于gfw问题,导致很多国外的网站 ...

  2. npm使用过程中的一些错误解决办法及npm常用命令和技巧

    node,npm在前端开发流程中提供了非常完善的自动化工具链,但是同样由于其复杂性导致有很多奇奇怪怪的问题.本文将记录使用过程中出现的一些问题及其解决方法备案. 国内由于gfw问题,导致很多国外的网站 ...

  3. win7 安装过程中遇到的错误解决方法

    win7 安装过程中遇到的错误解决方法 windows安装无法继续.若要安装windows 请单击 确定 重新启动计算机: 当 出现如上提示的时候,按下shift+f10 会打开命令窗口,进入到C:\ ...

  4. 编译recovery及过程中的部分错误解决

    你必须使用32位或64位Ubuntu系统,关于如何建立编译环境和同步源码的指导,请自己查找有关指导的文章. 1, 安装所需要的包 2, 建立编译的环境,并同步CWM所需的源码,CyanogenMod源 ...

  5. 2、Ansible在使用过程中出现的错误解决方法

    1.安装完成后允许命令出错 Traceback (most recent call last): File "/usr/bin/ansible", line 197, in (ru ...

  6. select into from 和 insert into select 的区别和用法及 SQL SELECT INTO 中Undeclared variable错误解决办法

    今天试了一下数据表中的数据备份到另一个空的数据表,然后使用了SQL SELECT INTO语句,然后提示Undeclared variable......错误,现在在这里做下总结并给出解决办法. 应用 ...

  7. [Django]我的第一个网页,报错啦~(自己实现过程中遇到问题以及解决办法)

    环境配置: python :2.7.13 django:1.10.5 OS:Win7(64位)& Centos7 问题描述  解决办法   global name 'render' is no ...

  8. Redhat中网络启动错误解决办法( Failed to start LSB: Bring up/down networking RTNETLINK answers: File exists)

    关于Redhat系列中网络启动失败的解决办法 报错: Failed to start LSB: Bring up/down networking.             RTNETLINK answ ...

  9. wget在linux中安装出现错误解决办法

    在使用wget命令报错 certificate common name 'xxx' doesn't match requestde host name,我们一般的解决办法是查找下载地址,但是有时候更换 ...

随机推荐

  1. 【剑指Offer学习】【面试题50:树中两个结点的最低公共祖先】

    题目:求树中两个结点的最低公共祖先,此树不是二叉树,而且没有指向父节点的指针. 树的结点定义 private static class TreeNode { int val; List<Tree ...

  2. [Phonegap+Sencha Touch] 移动开发24 打包wp8.1的App,执行时输入框聚焦弹出软键盘之后,界面上移而不恢复原位的解决的方法

    这个现象仅仅出如今phonegap打包sencha touch的wp8.1程序会出现(仅wp8.1,wp8正常),其他js框架我測试了几个(app framework, jquery mobile), ...

  3. Unity 3D游戏开发引擎:最火的插件推荐

    摘要:为了帮助使用Unity引擎的开发人员制作更完美的游戏.我们精心挑选了十款相关开发插件和工具.它们是:2D Toolkit.NGUI.Playmaker.EasyTouch & EasyJ ...

  4. 【CODEFORCES】 A. Dreamoon and Sums

    A. Dreamoon and Sums time limit per test 1.5 seconds memory limit per test 256 megabytes input stand ...

  5. HDU 5288 OO‘s sequence (技巧)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5288 题面: OO's Sequence Time Limit: 4000/2000 MS (Jav ...

  6. Sql去重

    distinct:用于返回唯一不同的值. 注意:1.语句中select显示的字段只能是distinct指定的字段,其他字段是不可能出现的. 2.distinct必须放在开头 如select disti ...

  7. 自学Zabbix3.5-监控项item

    itemItems是从主机里面获取的所有数据.通常情况下item为监控项,一般网络设备.服务器加入了zabbix监控,就需要监控它的cpu负载,那么实现这个方法的东西就叫item. 1. item构成 ...

  8. wordpess关闭评论的方法,wordpress开发

    由于某种原因,需要把wordpress的评论关闭,下面讲一下方法. 在wordpress模板中,找到文章模板页面文件single.php,在里面找到 <?php comments_templat ...

  9. 在IDEA中实战Git(转载自)

    转载自:http://blog.csdn.net/autfish/article/details/52513465 工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组 ...

  10. linux部署服务器遇到tomcat already start

    linux部署服务器遇到tomcat already start 前言,之前做了个汽车停车计费的后端,然后现在需要部署到服务器.正常部署,使用secureFx找到所属webapps目录,将文件上传.然 ...