使用requirejs加载一个带有几个类的文件(grunt-concat)

grunt concat和requirejs(和打字稿)有点问题。 问题很简单,当我为每个类生成一个文件,并单独加载每个文件,我没有问题。 (但浏览器速度较慢)示例:

  • A.js
  • Message.js
  • ValidatorMessage.js(扩展消息并具有依赖性)

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然后类的消息将工作,但不是下一个,所以我只有第一类加载是很好的加载!

编辑2:我也忘了说,在A不存在的情况下,在浏览器中的var消息存在和工作(如我在Edit1所说 ),但无效的ValidatorMessage也存在! 除了它是未定义的,我的意思是我从浏览器中获得了自动完成,但里面没有任何东西。 看起来像只有第一个define()把对象作为全局。

您应该在生产中使用r.js优化器 ,而不是手动连接文件。 否则你将失去模块化代码的好处(每个文件一个类)。 让优化器尽力搞清楚依赖图,不要试图重新发明轮子!

这是一个可怕的任务 。