【问题标题】:TypeScript 1.8 relative module name resolution in AMD style modules with RequireJS 2.1带有 RequireJS 2.1 的 AMD 样式模块中的 TypeScript 1.8 相对模块名称解析
【发布时间】:2016-11-09 07:26:48
【问题描述】:

我正在尝试在遗留 JS 系统的一部分中使用 TypeScript。 在这个系统中,存在许多在 RequireJS 环境中执行的应用程序,在该环境中 main.js 将在该应用程序启动时执行。我已经创建了这个结构

App1/
   main.js
   app.ts
   Modules/
      myModule.ts
      Models/
         model1.js
         model2.js

模型是生成的代码,必须保留为 .JS 文件。 来自不同 .ts 模块的“Require”语句应该需要模型。

我知道如何在模块文件夹中的声明文件中使用类似的东西来编译 .ts 文件。

   declare module "Models/model1" { var x:any; export = x;}  

但代码不会执行,因为这将为 myModule.ts 创建这样的 AMD 模块定义

define(["require","exports","Models/model1", function(require,exports,model){ ...

但路径被 Require.JS 解析为

 http://mysite/Models/model1.js

缺少路径部分,因为路径是相对的,并且必须是 RequireJS 的上下文根的绝对路径。我不能将模型作为 TS,因为它们是生成的文件。它们不仅仅通过重命名为 .ts 来编译 由于应用程序在线束、生产和单元测试设置中运行的不同方式,非相对路径也不可用。

问题:有没有办法让 TypeScript 为 JavaScript (.js) 模块生成相对路径?

【问题讨论】:

    标签: javascript typescript requirejs amd typescript-typings


    【解决方案1】:

    你看过Triple-Slash Directives吗?从 TypeScript 2.0 开始,import "moduleName" 已弃用,但应该适用于旧版本:

    /// <amd-dependency path="x" /> 通知编译器一个非 TS 需要在生成的模块中注入的模块依赖项 需要调用。

    amd-dependency 指令也可以有一个可选的 name 属性; 这允许为 amd 依赖传递一个可选名称:

    /// <amd-dependency path="legacy/moduleA" name="moduleA"/>
    declare var moduleA:MyType
    moduleA.callStuff()
    

    生成的JS代码:

    define(["require", "exports", "legacy/moduleA"], function (require, exports, moduleA) {
        moduleA.callStuff()
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 2017-02-08
      相关资源
      最近更新 更多