我对grunt concat和requirejs(和typescript)有点问题。 问题很简单,当我为每个类生成一个文件并且我单独加载每个文件时,我没有问题。 (但浏览器速度较慢) 例如:
loader.ts:
require.config({
paths: {
'A': '../generated/shared/A.min',
'Message': '../generated/shared/Message.min',
'ValidatorMessage': '../generated/shared/ValidatorMessage.min', }//more
那是有效的。我可以在浏览器中要求()每个文件,然后我就可以了。 但如果这样做:
require.config({
paths: {
'shared': '../generated/shared.min',
这不起作用。
shared.min.js
的内容/*! MotorEngine-web - v0.0.1 - 2013-11-30 04:11:18 - development */
///<reference path='./def/lib.d.ts'/>
///<reference path='./def/node.d.ts'/>
define([ "require", "exports" ], function(require, exports) {
/**
* @name ValidatorMessage
* @description Message object for Validation errors.
* @author Vadorequest
*/
var A = function() {
function A() {}
/**
* Get the message.
* @returns {string}
*/
return A.prototype.getErrors = function() {
return this._errors;
}, A;
}();
exports.A = A;
}), ///<reference path='./def/lib.d.ts'/>
///<reference path='./def/node.d.ts'/>
define([ "require", "exports" ], function(require, exports) {
/**
* @name Message
* @description Message object for both server and client side communication.
* @author Vadorequest
*/
var Message = function() {
/**
* Constructor.
* @param message Message to display.
* @param data Data useful for callback, can be anything.
* @param status Status of the message.
*/
function Message(message, data, status) {
"undefined" == typeof data && (data = !1), "undefined" == typeof status && (status = !1),
/**
* Constants.
*/
this.FIELD_NAME_MESSAGE = "m", this.FIELD_NAME_DATA = "d", this.FIELD_NAME_STATUS = "s",
this.EXCEPTION_BAD_JSON_CONTENT = 'Unable to parse JSON. Bad object/string attributes. (Missing message ("' + this.FIELD_NAME_MESSAGE + '" field) or status ("' + this.FIELD_NAME_MESSAGE + '" field)?',
this.EXCEPTION_BAD_JSON_TYPE = "Incorrect data type. Object or string expected.",
this._message = message, this._data = data, this._status = status;
}
/**
* Get the message.
* @returns {string}
*/
return Message.prototype.getMessage = function() {
return this._message;
}, /**
* Get message data.
* @returns {*}
*/
Message.prototype.getData = function() {
return this._data;
}, /**
* Get message status.
* @returns {boolean}
*/
Message.prototype.getStatus = function() {
return this._status;
}, /**
* Returns the current object as JSON string.
* @returns {string}
*/
Message.prototype.toJSON = function() {
return JSON.stringify(this._toSimpleObject());
}, /**
* Returns the current object without methods.
* @returns {Object}
*/
Message.prototype.toObject = function() {
return this._toSimpleObject();
}, /**
* Returns a custom object without method using the predefined FIELD_NAME to take less space once converted in JSON string.
* @returns {{}}
* @private
*/
Message.prototype._toSimpleObject = function() {
var json = {};
return json[this.FIELD_NAME_MESSAGE] = this._message, this._data !== !1 && (json[this.FIELD_NAME_DATA] = this._data),
json[this.FIELD_NAME_STATUS] = this._status, json;
}, /**
* Convert JSON to a Message object instance.
* @param json Json to convert to object.
* @returns {Message.Message}
*/
Message.prototype.fromJSON = function(json) {
if ("object" == typeof json) return this._fromJSONObject(json);
if ("string" == typeof json) return this._fromJSONString(json);
throw "Message.fromJSON " + this.EXCEPTION_BAD_JSON_TYPE;
}, /**
* Convert JSON object to a Message object instance.
* @param json Json to convert to object.
* @returns {Message.Message}
* @private
*/
Message.prototype._fromJSONObject = function(json) {
if (json[this.FIELD_NAME_MESSAGE] && json[this.FIELD_NAME_STATUS]) return json[this.FIELD_NAME_DATA] ? new Message(json[this.FIELD_NAME_MESSAGE], json[this.FIELD_NAME_DATA], json[this.FIELD_NAME_STATUS]) : new Message(json[this.FIELD_NAME_MESSAGE], !1, json[this.FIELD_NAME_STATUS]);
throw "Message._fromJSONObject " + this.EXCEPTION_BAD_JSON_CONTENT;
}, /**
* Convert JSON string to a Message object instance.
* @param json Json to convert to object.
* @returns {Message.Message}
* @private
*/
Message.prototype._fromJSONString = function(json) {
try {
return this._fromJSONObject(JSON.parse(json));
} catch (e) {
throw "Message._fromJSONString: JSON.parse error:" + e.message;
}
}, Message;
}();
exports.Message = Message;
});
///<reference path='./def/lib.d.ts'/>
///<reference path='./def/node.d.ts'/>
var __extends = this.__extends || function(d, b) {
function __() {
this.constructor = d;
}
for (var p in b) b.hasOwnProperty(p) && (d[p] = b[p]);
__.prototype = b.prototype, d.prototype = new __();
};
define([ "require", "exports", "Message" ], function(require, exports, __message__) {
var message = __message__, ValidatorMessage = function(_super) {
function ValidatorMessage(message) {
_super.call(this, message);
}
return __extends(ValidatorMessage, _super), /**
* Get the message.
* @returns {string}
*/
ValidatorMessage.prototype.getErrors = function() {
return this._errors;
}, ValidatorMessage;
}(message.Message);
exports.ValidatorMessage = ValidatorMessage;
});
我不明白是不是因为在同一个文件或其他内容中有多次调用。你呢?
修改 我忘了说在这个例子中,A类将是可用的浏览器端(和工作),但不是以下。如果我删除A到shared.min.js然后类消息将工作,但不是下一个,所以我只是加载了第一个类加载好了!
EDIT2: 我也忘了说在A不存在的情况下,浏览器中的var消息存在并且正常工作(正如我在 Edit1 中所说的那样)但是也存在var ValidatorMessage!除了它未定义,我的意思是我从浏览器获得自动完成但内部没有任何内容。看起来只有第一个define()将对象设置为全局。
答案 0 :(得分:1)
您应该使用r.js optimizer in production,而不是手动将文件连接在一起;否则你将失去模块化代码的好处(每个文件一个类)。让优化器完成确定依赖图的艰苦工作,不要试图重新发明轮子!
这有一个grunt task available。