gpt4 book ai didi

node.js - 在 Node 上将 RequireJS 与 Mocha 和 SquireJS 结合使用

转载 作者:太空宇宙 更新时间:2023-11-03 22:47:32 25 4
gpt4 key购买 nike

我尝试在 Node 中使用 RequireJS,发现路径问题很困难。

这是一个返回“foo”的简单 foo 方法

$ cat src/foo.js 

define([], function() {

var foo = function() {
return "foo";
};

return { foo:foo};
});

这里是 bar 需要 foo,但它仅在指定相对路径时有效。事情应该是这样吗?

$ cat src/bar.js
define(['./foo.js'], function(foo) {

var bar = function() {
return foo.foo().replace("foo","bar");
};

return { bar : bar };
});

Mocha 测试中事情变得更加棘手:

  1. 加载 foo 和 bar 需要 __dirname 解决方法。
  2. bar 的异步加载失败(参见测试 3 和 4)。
  3. 导入 Squire 需要准确的路径,因为它是使用 npm install 安装的,但不符合标准的 Node require 语法,并且不包含 amdefine 解决方法:

这是测试代码:

$ cat test/footests.js 
var requirejs = require('requirejs');
var chai = requirejs("chai");
var should = chai.should();
var Squire = requirejs(__dirname + "/../node_modules/squirejs/src/Squire.js");

describe('when calling foo.foo()', function () {
it('should return "foo"', function() {
var foo = requirejs(__dirname + "/../src/foo.js");
foo.foo().should.equal("foo");
});
});

describe('when calling bar.bar()', function () {
var bar = requirejs(__dirname + "/../src/bar.js");
it('should return "bar"', function() {
bar.bar().should.equal("bar");
});
});

describe('when calling bar.bar() with async requirejs', function () {
it('should return "bar"', function(done) {
requirejs(__dirname + "/../src/bar.js", function(bar) {
bar.bar().should.equal("bar");
done();
})
});
});
describe('when mocking foo.foo() and calling bar.bar()', function () {
it('should return "barbar"', function(done) {
var injector = new Squire();
var fooMock = {
foo : function() {
return "foofoo"; /* instead of just foo */
}
};
injector
.mock('./foo.js', fooMock)
.require(__dirname + "/../src/bar.js", function(bar) {
bar.bar().should.equal("barbar");
done();
});
});
});

我已经在 github 上设置了复制品 https://github.com/itaifrenkel/node-requirejs-example

最佳答案

您的代码中存在多个问题:

  1. 不要将 .js 放在模块名称的末尾。添加 .js 告诉 RequireJS 绕过正常的模块名称解析。 (在某些情况下,您想要该扩展程序,但在这些情况下您应该可以说出为什么需要它。)

  2. Node 中的 RequireJS 可以进行配置,就像在浏览器中使用它一样。这样就无需在各处重复路径。

  3. RequireJS 可以使用 packages 设置加载包。

  4. 当不需要时,不要使用 RequireJS 加载 Node 模块。 (例如,chai 不需要使用 RequireJS 加载。)

如果我修改 bar.js 以从其单独的依赖项中删除 .js 扩展名并使用以下测试文件,则它可以工作:

var requirejs = require('requirejs');
requirejs.config({
baseUrl: __dirname + "/../src",
packages: [
{
name: "squirejs",
location: "../node_modules/squirejs",
main: "src/Squire"
}
]
});
var chai = require("chai");
var should = chai.should();
var Squire = requirejs("squirejs");

describe('when calling foo.foo()', function () {
it('should return "foo"', function() {
var foo = requirejs("foo");
foo.foo().should.equal("foo");
});
});

describe('when calling bar.bar()', function () {
var bar = requirejs("bar");
it('should return "bar"', function() {
bar.bar().should.equal("bar");
});
});

describe('when calling bar.bar() with async requirejs', function () {
it('should return "bar"', function(done) {
requirejs(["bar"], function(bar) {
bar.bar().should.equal("bar");
done();
});
});
});
describe('when mocking foo.foo() and calling bar.bar()', function () {
it('should return "barbar"', function(done) {
var injector = new Squire();
var fooMock = {
foo : function() {
return "foofoo"; /* instead of just foo */
}
};
injector
.mock('./foo', fooMock)
.require(["bar"], function(bar) {
bar.bar().should.equal("barfoo");
done();
});
});
});

关于node.js - 在 Node 上将 RequireJS 与 Mocha 和 SquireJS 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23361700/

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