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
没有意识到在第一种情况下需要正确地包含 Prelude
和 Control.Monad.Eff
。 psc-bundle
应该 将那些 require
调用替换为对其他模块的引用,以便代码在浏览器中工作。
有几种不同的方式可以发生这种情况,编译器现在已经更新了一种方式,应该可以大大降低这种情况再次发生的可能性,所以我不会花太多时间去担心究竟是如何发生的这已经发生了。
如果以上 none 对您有意义,请不要担心;我认为您只需执行以下操作即可解决此问题:
- 更新到最新版本
psc
(0.8.3 将 --require-path
默认更改为 ../
,因此 0.8.3 之后的任何版本都应该可以,但您需要大多数情况下是最新版本)
- 删除您的
output
目录
- 重新编译一切。
当我使用 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
没有意识到在第一种情况下需要正确地包含 Prelude
和 Control.Monad.Eff
。 psc-bundle
应该 将那些 require
调用替换为对其他模块的引用,以便代码在浏览器中工作。
有几种不同的方式可以发生这种情况,编译器现在已经更新了一种方式,应该可以大大降低这种情况再次发生的可能性,所以我不会花太多时间去担心究竟是如何发生的这已经发生了。
如果以上 none 对您有意义,请不要担心;我认为您只需执行以下操作即可解决此问题:
- 更新到最新版本
psc
(0.8.3 将--require-path
默认更改为../
,因此 0.8.3 之后的任何版本都应该可以,但您需要大多数情况下是最新版本) - 删除您的
output
目录 - 重新编译一切。