TypeScript、RequireJS shim 和环境模块声明

4
我有以下指向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配置文件中使用了shim技术来解决全局命名的问题。我希望我的define方法只需写backbone即可,而不需要写相对路径。除了后期构建过程中处理define的方式,还有其他的解决方法吗?

3个回答

3

我认为解决这个问题的方法是将环境声明放在最终实际模块的相同位置,这样你就可以用相同的路径引用它。

因此,backbone.d.ts需要与backbone.js位于相同的位置。


它位于相同的位置,但是Shim会为我处理导出和依赖项,而无需将真正的backbone.js变成一个amd-ified模块。 - ryan

1

我总是使用从根目录开始的路径,而不是使用相对路径。例如:

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

而且诀窍在于您可以在您的 shim 中定义相同的名称。就像这样:

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

始终使用从根目录开始的路径,这样路径就会保持不变,而不是使用相对路径。这是一个技巧,但对我很有效(GitHub)。


0

我刚刚写了一篇关于如何在TypeScript中使用AMD模块的博客。

首先,只需使用以下方式将backbone作为引用路径:

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

然后在不使用import的情况下定义你的类:

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

然后你需要配置 require 和 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();
});

一旦应用程序到达所需的代码块,Backbone 就被全局定义了。
玩得开心!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接