要求具有绝对路径的本地节点模块不能在Windows

时间:2016-01-28 11:31:40

标签: javascript node.js

我正在开发一个包含多个模块的Node应用程序。 我的节点应用程序使用Babel转换为/dist/app

这是一个示例结构

.
|- main
|   |- config.js
|   |- factories
|   |     |- example.js

这是 config.js

const ex = require("/main/factories/example");

我使用node dist/app/main/config.js启动config.js。 产生的错误是:

  

错误:找不到模块' / main / factories / example";

然而,当使用const ex = require("./factories/example");时,它可以正常工作。

此问题仅发生在 Windows (测试Windows 8.1)上,OS X和Linux都可以。

这里有什么问题?

2 个答案:

答案 0 :(得分:2)

反过来说,代码在Windows上按预期工作。 /main/factories/example表示Windows上的C:/main/factories/example。它可以在OSX / Linux上运行,因为某些原因(可能是设置了NODE_PATH)。我建议不要依赖副作用来拥有一个正常工作的代码并且不使用相对路径(完全依赖于工作目录),你应该像这样构建你的绝对路径:

const ex = require(__dirname + "/factories/example");

答案 1 :(得分:1)

我想也许NODE_PATH导致了这个问题。请参阅此文Better local require() paths for Node.js。有几种方法可以要求本地节点模块

  • The Symlink

    在node_modules下创建一个符号链接到你的app目录:

    • Linux:ln -nsf node_modules app
    • Windows:mklink /D app node_modules
  • The Module

    安装一些模块:

    npm install app-module-path --save

    在你的app.js中,在任何require()调用之前:

    require('app-module-path').addPath(__dirname + '/app');

    在你的/ far / away / module.js中:

    var Article = require('models/article');

  • The startup script

    Linux,在项目根目录中创建app.sh:

     #!/bin/sh
     NODE_PATH=. node app.js
    

    Windows,在项目根目录中创建app.bat:

     @echo off
     cmd.exe /C "set NODE_PATH=.&& node app.js"
    

希望它可以帮助你。