TypeScript,RequireJS shim,环境模块声明

时间:2012-10-22 15:35:44

标签: javascript requirejs typescript js-amd

我有以下内容指向backbone.d.ts定义。

import Backbone = module("../../../dep/backbone/backbone");

export class Codebook extends Backbone.Model {

    defaults() {
        return {
            id: -1,
            title: -1
        }
    }

    initialize() {
        // do nothing
    }

}

使用--module amd生成以下内容。

define(["require", "exports", "../../../dep/backbone/backbone"], function(require, exports, __Backbone__) {

由于全局,我使用RequireJS配置文件填充了主干。我希望我的定义只是说backbone而不是相对路径。除了后期构建过程之外是否有任何解决方法来操作定义?

3 个答案:

答案 0 :(得分:3)

我认为此问题的解决方案是将环境声明放在与最终实际模块相同的位置,以便您可以使用相同的路径引用它。

因此backbone.d.ts需要与backbone.js位于同一位置。

答案 1 :(得分:1)

我总是使用根路径,而不是使用相对路径。类似的东西:

import underscore = module('libs/underscore/underscore');

并且黑客是你可以在你的垫片中定义相同的名称。像这样:

require.config({
    paths: {
        'libs/underscore/underscore': 'libs/underscore/underscore'
    },
    shim: {
        'libs/underscore/underscore': {
            exports: '_'
        }
    }
});

通过始终使用来自根的路径,路径保持相同,就像使用相对路径一样。这是一个黑客,但它适用于我(GitHub)。

答案 2 :(得分:0)

我刚刚在how to use AMD modules in TypeScript上放了一个博客。

首先,只需使用骨干的参考路径,如下所示:

/// <reference path="../../modules/Backbone.d.ts" />

然后在没有导入的情况下定义您的类:

export class MTodoCollectionView extends Backbone.View {
...
}

然后是您的require.config和apploader:

require.config({
    baseUrl: '../',
    paths: {
        'underscore': 'lib/underscore',
        'backbone': 'lib/backbone'
    }, 
    shim: {
        underscore: {
            exports: '_'
        },
        backbone: {
            deps: ["underscore", "jquery"],
            exports: "Backbone"
        }
    }
});

require(['jquery','underscore','backbone','console','app/AppMain', 
     ], 
    ($, _, Backbone, console, main) => {
    // code from window.onload
    var appMain = new main.AppMain();
    appMain.run();
});

一旦应用程序遇到require代码块,Backbone就会被全局定义 玩得开心,