我对NodeJS还是个新手,所以如果我的问题太天真的话,请原谅我。我发现在服务器上运行Javascript非常有趣。
然而,有一件事严重影响了我的经历。这是一个冗长的,容易出错的安装过程,每个新的软件包,导致似乎永远不会结束的一系列HTTP请求。我甚至可以一次又一次地看到对相同资源的多个请求,我想这些资源本来可以被缓存。
更糟糕的是,在许多其他请求完成并浪费时间之后,我经常会收到错误,然后安装失败,原因不明。
我的问题是:
>
是否可以先下载一个稳定的大多数使用的包束,以避免通过HTTP请求它们?
然后在本地运行安装,使用包中的大多数包,并且只通过HTTP请求什么是真正新的和重要的?
这样做的好处是:
>
最小化请求的数量,使整个过程更快。我觉得是请求的数量让它花费了这么长的时间,所以性能会显著提高。尤其是在连接速度较慢的情况下。
只使用稳定且经过测试的软件包,而不使用可能导致错误并导致安装失败的最新软件包。我猜这些是最后一个不稳定的软件包,这些软件包会导致错误,导致安装失败。
作为Node的新手,我的问题可能很天真,我可能遗漏了一些基本的东西。在这种情况下,我想学习它,并了解背后的原因。
只是为了给一些“肉”,下面是我最近(失败的)安装Yeoman的尝试:
$ sudo npm install -g yo Password: npm http GET https://registry.npmjs.org/yo npm http 304 https://registry.npmjs.org/yo npm http GET https://registry.npmjs.org/yeoman-generator npm http GET https://registry.npmjs.org/nopt npm http GET https://registry.npmjs.org/update-notifier npm http GET https://registry.npmjs.org/insight npm http GET https://registry.npmjs.org/sudo-block npm http GET https://registry.npmjs.org/open/0.0.4 npm http GET https://registry.npmjs.org/chalk npm http GET https://registry.npmjs.org/findup npm http GET https://registry.npmjs.org/lodash npm http GET https://registry.npmjs.org/async npm http 200 https://registry.npmjs.org/update-notifier npm http GET https://registry.npmjs.org/update-notifier/-/update-notifier-0.1.7.tgz npm http 200 https://registry.npmjs.org/open/0.0.4 npm http GET https://registry.npmjs.org/open/-/open-0.0.4.tgz npm http 200 https://registry.npmjs.org/open/-/open-0.0.4.tgz npm http 200 https://registry.npmjs.org/update-notifier/-/update-notifier-0.1.7.tgz ...
注意上次资源的重复请求!然后一页又一页的错误出现:
npm http 200 https://registry.npmjs.org/rimraf/-/rimraf-2.2.5.tgz npm ERR! Error: shasum check failed for /Users/dmitrizaitsev/tmp/npm-2533/1387980648215-0.5165209104306996/tmp.tgz npm ERR! Expected: a4663b53686b895ff074e2ba504dfb76a8e2b770 npm ERR! Actual: 8d2a8a2b726937c7cc6a86207b56e3a38d853f1e npm ERR! at /usr/local/lib/node_modules/npm/node_modules/sha/index.js:32:8 npm ERR! at ReadStream. (/usr/local/lib/node_modules/npm/node_modules/sha/index.js:61:7) npm ERR! at ReadStream.EventEmitter.emit (events.js:117:20) npm ERR! at _stream_readable.js:883:14 npm ERR! at process._tickCallback (node.js:415:13) npm ERR! If you need help, you may report this log at: npm ERR! npm ERR! or email it to: npm ERR! npm ERR! System Darwin 12.5.0 npm ERR! command "node" "/usr/local/bin/npm" "install" "-g" "yo" npm ERR! cwd /Users/dmitrizaitsev/Dropbox/Priv/APP npm ERR! node -v v0.10.3 npm ERR! npm -v 1.2.21 npm http 200 https://registry.npmjs.org/ansi-styles npm http GET https://registry.npmjs.org/ansi-styles/-/ansi-styles-0.2.0.tgz ... npm http 200 https://registry.npmjs.org/cheerio npm ERR! registry error parsing json npm http 200 https://registry.npmjs.org/form-data/-/form-data-0.1.2.tgz ...
而这里的失败(又是在一页又一页之后):
npm http 200 https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz npm ERR! npm ERR! Additional logging details can be found in: npm ERR! /Users/dmitrizaitsev/Dropbox/Priv/APP/npm-debug.log npm ERR! not ok code 0
首先,为了回答你的两个问题,
默认情况下,npm应该缓存包,请参阅此处的配置示例(my~/.npm中缓存了包)。我假设您正在为您的包使用package.json文件?
如果你真的很想在你自己的机器上有一堆软件包的某个版本,也许可以看看npm-mirror?
看起来,您的rimraf下载的问题似乎是它正在失败/被破坏(sha1和不匹配)。我可以在我的机器上成功下载rimraf,没有任何问题。
另外,如果您使用git将软件包推送到您的服务器,并且担心每次推送软件包时服务器会重新安装软件包,那么我的。git钩子(post-receive)中的一个是缓存npm软件包,然后签出我的repo(它不保留npm软件包),然后在运行npm install
之前将它们重新放回,这样它们就不必重新下载了。