我知道这是一个较旧的讨论,但我在使用angular2与systemjs时遇到了这个问题。我作为meta的唯一东西如下:
System.config({
'defaultJSExtensions': true,
baseURL: '/js',
map: {
text: '/js/angular2/text.js'
}
}
我使用文本插件来加载我的html视图并且它们确实正确加载,但是我仍然会在下面提到这个错误,为什么会这样?
“text.js:4未捕获的ReferenceError:未定义导出(匿名函数)”
整个text.js
文件非常简单:
(function(System, SystemJS) {(function(require, exports, module, __filename, __dirname, global, GLOBAL) {/*
Text plugin
*/
exports.translate = function(load) {
return 'module.exports = "' + load.source
.replace(/(["\\])/g, '\\$1')
.replace(/[\f]/g, "\\f")
.replace(/[\b]/g, "\\b")
.replace(/[\n]/g, "\\n")
.replace(/[\t]/g, "\\t")
.replace(/[\r]/g, "\\r")
.replace(/[\u2028]/g, "\\u2028")
.replace(/[\u2029]/g, "\\u2029")
+ '";';
}
}).apply(__cjsWrapper.exports, __cjsWrapper.args);
})(System, System);
第4行确实是exports.translate
。我找不到text.js
指定我没有使用NodeJS的选项,那么我该如何解决这个问题?
答案 0 :(得分:1)
如果您想使用SystemJS API,我会尝试以下方法来注册您的模块:
System.register('mymodule', [ ], function(exports, context) {
exports.translate = function(load) {
return 'module.exports = "' + load.source
.replace(/(["\\])/g, '\\$1')
.replace(/[\f]/g, "\\f")
.replace(/[\b]/g, "\\b")
.replace(/[\n]/g, "\\n")
.replace(/[\t]/g, "\\t")
.replace(/[\r]/g, "\\r")
.replace(/[\u2028]/g, "\\u2028")
.replace(/[\u2029]/g, "\\u2029")
+ '";';
};
});
这样您就不需要在text.js
中添加map
,而是直接使用<script>
标记:
<script src="text.js"></script>
然后您可以这样导入您的模块:
import {translate} from 'mymodule';
修改强>
使用匿名模块:
System.register([ ], function(exports, context) {
exports.translate = function(load) {
return 'module.exports = "' + load.source
.replace(/(["\\])/g, '\\$1')
.replace(/[\f]/g, "\\f")
.replace(/[\b]/g, "\\b")
.replace(/[\n]/g, "\\n")
.replace(/[\t]/g, "\\t")
.replace(/[\r]/g, "\\r")
.replace(/[\u2028]/g, "\\u2028")
.replace(/[\u2029]/g, "\\u2029")
+ '";';
};
});
在这种情况下,您可以将模块文件与名称(使用默认扩展名或packages
块中的专用条目)链接起来。
答案 1 :(得分:0)
如果text.js
的请求是通过浏览器而不是SystemJS
发送的,则会发生这种情况。必须通过SystemJS
请求并下载。您的开发捆绑应该正确设置以适应这一点。
虽然正如@Thierry Themplier所提到的那样,您可以保留原样并为文件夹创建包配置,以指定默认的.js
扩展名和.html
或您需要的任何其他扩展程序。在我的情况下,这将是一个维护噩梦,其中包含深层文件夹层次结构以及对源文件所在位置的错误依赖性。