与 RequireJS 同构 JavaScript

Isomorphic JavaScript with RequireJS

我有一些同构JavaScript。我在客户端使用 RequireJS。

(function() {
    'use strict';

    function wrapper(require) {
      var MyDep = require('my-dependency');

      return function MyExportedFunction() {
          // ...
      };
    }

    if ((typeof exports === 'object') && module) {
        module.exports = wrapper(require); // CommonJS
    } else if ((typeof define === 'function') && define.amd) {
        define(function(require) {
            /**
             * I need to `require` dependencies 
             * in here for them to be available inside 
             * the wrapper function :(
             */
            require('my-dependency');
            return wrapper(require);
        }); // AMD
    }
}());

有没有办法避免必须在 wrapper 函数调用之前立即放置 require 语句?

如果我省略 require 语句,RequireJS 会抱怨尚未为上下文加载依赖项。

我认为这是 RequireJS 提前解析和识别所需依赖项的能力的一个不可逾越的限制。

是的,RequireJS 只能处理 require 的 CommonJS 形式,前提是它立即出现在传递给 define 的工厂函数中。如果它出现在从工厂函数调用但在函数外部定义的函数中,则它将不起作用。在内部,RequireJS 在工厂函数的源代码上运行一个正则表达式。

话虽这么说,但在我看来,您应该能够将当前对 define 的调用替换为:

define(wrapper)

这将调用 wrapper 并引用 RequireJS 的 require 函数 RequireJS 应该能够分析 wrapper 的来源提取 CommonJS 调用。