相关疑难解决方法(0)

如何编写一个适用于Node.js,RequireJS以及没有它们的模块

我正在开发一个用于JSON/XML处理的JavaScript库.我的库在浏览器以及Node.js(带xmldomxmlhttprequest模块)中工作.

其中一位用户最近要求提供RequireJS支持.我已经看了一下RequireJS/AMD的东西,认为这是一个很好的方法,所以我想提供这个.

但是我想保留可移植性:我的库必须在浏览器(有和没有RequireJS)以及Node.js中工作.在浏览器环境中,我不依赖xmldomxmlhttprequest因为这些东西是由浏览器本身提供的.

我的问题是:我如何实现我的库,以便它在浏览器以及没有RequireJS的Node.js中工作?

一点历史和我目前的解决方案

我最初为浏览器编写了我的库.所以它只是创建了一个全局范围的对象并将所有内容放入其中:

var Jsonix = { ... };
Run Code Online (Sandbox Code Playgroud)

后来用户要求Node.js支持.所以我补充说:

if(typeof require === 'function'){
    module.exports.Jsonix = Jsonix;
}
Run Code Online (Sandbox Code Playgroud)

我还必须导入上面提到的几个模块.我有条件地做了,取决于require功能是否可用:

if (typeof require === 'function')
{
    var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest;
    return new XMLHttpRequest();
}
Run Code Online (Sandbox Code Playgroud)

现在有了RequireJS这个故事.如果存在RequireJS,则该require函数也存在.但模块加载的工作方式不同,我必须使用define函数等.我也不能只是require因为require在RequireJS中有一个异步API.此外,如果我的库是通过RequireJS加载的,它似乎处理源代码并检测require('something')即使我有条件地执行它

if (typeof require === 'function' && typeof require.specified !== 'function) ...
Run Code Online (Sandbox Code Playgroud)

RequireJS仍然检测到require('xmlhttprequest')尝试加载相应的JS文件.

目前我正在寻求以下解决方案.

// Module factory function, AMD style …
Run Code Online (Sandbox Code Playgroud)

javascript amd node.js requirejs js-amd

9
推荐指数
2
解决办法
2460
查看次数

标签 统计

amd ×1

javascript ×1

js-amd ×1

node.js ×1

requirejs ×1