在基于require.js的项目中加载webpack模块将返回null

时间:2015-10-15 11:23:31

标签: javascript requirejs webpack

我试图加载一个在require.js项目中编译为Webpack的库。当库公开一个对象时,它在require.js项目中需要时返回null:

define(function(require, exports, module) {
  [...]
  require("./ext/mylib.core.js"); // -> null
})

我是否可以在Webpack中使用任何标志来启用AMD合规性?在生成的库中有一些对AMD的引用,但因为它似乎没有做任何事情。

2 个答案:

答案 0 :(得分:4)

解决方案是在Webpack文档中:有一个outputLibrary标志,可以设置为" amd"或者" umd"在这种情况下,webpack生成符合amd标准的模块。

答案 1 :(得分:2)

编辑3: / 编辑:4 Webpack似乎没有合作,所以另一种可能性是使用shim配置选项公开模块:

require.config({
    paths: {
        // Tell require where to find the webpack thingy
        yourModule: 'path/to/the/webpack/asset'
    },
    shim: {
        // This lets require ignore that there is no define
        // call but will instead use the specified global
        // as the module export
        yourModule: {
            exports: 'theGlobalThatIsPutInPlaceByWebpack'
        }
    }
});

这显然只适用于webpack的东西在全球范围内放置的东西。希望这有帮助!

编辑2: 所以我在评论中指出错误的问题。我没有找到任何内置功能来从webpack生成AMD模块 - 最终结果似乎是静态资产js文件。您可以将结果包装在

define(function () {
    return /* the object that webpack produces */;
});

阻止,可能是在一些后期构建事件的帮助下(例如使用this after build plugin for webpack)。然后你应该能够要求模块带有AMD加载器。

原始答案:

require.js异步加载它的依赖项,当你不使用r.js优化器等时,必须明确声明它们。因此,如果模块公开AMD定义,它应该像这样工作:

// It works the way you did it ...
define(['path/to/your/module'], function (require, exports, module) {
    require('path/to/your/module'); // -> { ... }
});

// ... but I personally prefer this explicit syntax + it is
// friendlier to a code minifier
define(['path/to/your/module'], function (yourModule) {
    console.log(yourModule); // { ... }
});

也许您必须配置您的require实例,有docs for that

EDIT1:正如指出访问模块的方式没错,但缺少依赖关系,所以我添加了更接近原始问题的代码。