Purescript pulp 构建输出在浏览器中生成 requirejs 错误

Purescript pulp build output generates requirejs error in browser

当我使用 pulp build -O -t html/main.js 然后 pulp build -O -I test -m Test.Main -t html/testmain.js(即构建主要和测试)时,我得到两个不同的 js 输出。在前一种情况下,格式为

// Generated by psc-bundle 0.8.2.0
var PS = { };
(function(exports) {
  // Generated by psc version 0.8.2.0
  "use strict";
  var Prelude = require("../Prelude");
  var Control_Monad_Eff = require("../Control.Monad.Eff");
  exports["main"] = main;
})(PS["Main"] = PS["Main"] || {});
PS["Main"].main();

请注意要求。在后一种情况下,require 根本就没有到位

// Generated by psc-bundle 0.8.2.0
var PS = { };
(function(exports) {
  /* global exports */
  "use strict";

  exports.concatArray = function (xs) {
    return function (ys) {
      return xs.concat(ys);
    };
  };

  exports.showNumberImpl = function (n) {
    /* jshint bitwise: false */
    return n === (n | 0) ? n + ".0" : n.toString();
  };

})(PS["Prelude"] = PS["Prelude"] || {});
(function(exports) {
// Generated by psc version 0.8.2.0
  "use strict";
  var $foreign = PS["Prelude"];
  var Semigroupoid = function (compose) {
      this.compose = compose;
  };

这两个例子都缩短了,重点是第一次用了require,第二次没有用。 问题是由于此错误

,我无法 运行 在浏览器中使用 require 的版本

ReferenceError: require is not defined

当我将 require.js 包含到页面中时,出现此错误

Error: Module name "../Prelude" has not been loaded yet for context: _. Use require([]) http://requirejs.org/docs/errors.html#notloaded

因此我的问题是,运行 浏览器中的第一种情况可以做些什么。

您可能需要使用 --browserify 选项为浏览器构建第一个案例。

我的猜测是,这来自 运行 具有不同 --require-path 选项的构建;一次使用旧的默认值,它是一个空字符串,一次使用 ../。这将导致 psc-bundle 没有意识到在第一种情况下需要正确地包含 PreludeControl.Monad.Effpsc-bundle 应该 将那些 require 调用替换为对其他模块的引用,以便代码在浏览器中工作。

有几种不同的方式可以发生这种情况,编译器现在已经更新了一种方式,应该可以大大降低这种情况再次发生的可能性,所以我不会花太多时间去担心究竟是如何发生的这已经发生了。

如果以上 none 对您有意义,请不要担心;我认为您只需执行以下操作即可解决此问题:

  • 更新到最新版本 psc(0.8.3 将 --require-path 默认更改为 ../,因此 0.8.3 之后的任何版本都应该可以,但您需要大多数情况下是最新版本)
  • 删除您的 output 目录
  • 重新编译一切。