2

我有一个名为的小节点脚本/tmp/test.js,其中包含:

console.log(require("w3cjs"));

如果我从命令提示符执行此操作:

nvm use v0.10.21
node /tmp/test.js

我得到这个输出:

module.js:340
    throw err;
      ^
Error: Cannot find module 'w3cjs'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (/tmp/test.js:1:75)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)

但如果我这样做:

node -e $(cat /tmp/test.js)

我得到这个输出:

{ validate: [Function: validate],
  setW3cCheckUrl: [Function: setW3cCheckUrl],
  w3cjs: [Circular] }

(换句话说 - 它有效。)

为什么会有差异以及如何使脚本正常工作?

4

1 回答 1

9

当您在不同的目录中运行脚本时,Node 会在node_modules该脚本目录的文件夹中查找本地模块。

假设你的 shell 的工作目录当前是/projects/foo. 当你运行时node /tmp/test.js,Node 会在 中查找模块/tmp/node_modules,而不是在/projects/foo/node_modules.

但是,如果您不运行脚本文件,而是在命令行中使用 运行一些文本-e,Node 将检查您的 shell 当前工作目录中的本地模块文件夹,即/projects/foo/node_modules.

您似乎已w3cjs安装在工作目录中,但未安装在/tmp. 您应该在那里安装它,或者使用's option全局安装模块npm-g

于 2013-11-01T14:32:27.127 回答