gpt4 book ai didi

javascript - 你如何强制 Node 模块的绝对路径?

转载 作者:搜寻专家 更新时间:2023-10-31 23:18:42 26 4
gpt4 key购买 nike

我有一个使用 CommonJS 模块样式的 Titanium 项目。但是,代码使用绝对路径,因此当它构建时,绝对路径被沙盒化到应用程序目录。

var foo = require("/lib/module");

我想在命令行上运行一些测试并让 jasmine-node 正常工作。然而,当测试执行模块时,模块将在其 require 语句中具有上述绝对路径。

有没有办法隔离(可能是 chroot) Node 来解析特定目录的绝对要求路径?如果是怎么办?

-- RepositoryRoot/
|- app/
| \- Resources/
| |- app.js # Has require("/lib/module1.js")
| \- lib/
| |- module1.js # Has require("/lib/module2.js")
| \- module2.js
\- tests/
\- module1.spec.js # Has require("../app/Resources/lib/module1")
# Or require("/lib/module1")

最佳答案

在这里找到解决方案后,我了解到:对上述问题的简短回答是你不能那样做。 Node 将绝对路径读取为绝对路径。所以简而言之,答案是将我的路径从绝对路径更改为伪绝对(相对)路径。这是来自 this blog post 的引述这说明了一些问题:

the Titanium implementation of CommonJS require() is buggy and doesn’t correctly support relative paths. This represents a major problem when trying to integrate jasmine-node test runners in projects with even minimally complex directory trees.

A possible solution to the issue is to not use relative paths in require() in Titanium (but you are free to use them in your jasmine specs run through node). Instead of relative paths we need to use full paths with Resources as the root directory.

这是通过在运行任何 Node 命令之前设置 NODE_PATH 环境变量来实现的。这样,诸如 `require("module/path") 之类的路径由 Node titanium 解析。

有一些注意事项。一些模块强制需要绝对路径。在这种情况下,需要 proxyquire只要没有任何循环依赖关系,就可以模拟出绝对路径,这将起作用。此外,由于 Node 没有 Titanium API,您还必须包含 mockti模拟 Titanium API 的包。在您的 spec_helper.js 中使用它:

global.Ti = require("mockti");

proxyquire = require("proxyquire");
var myModule = proxyquire("relative/path/to/MyModule", {
"/absolute/path/to/some/module": require("absolute/path/to/some/module")
});

关于javascript - 你如何强制 Node 模块的绝对路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14669390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com