【问题标题】:Relative paths using requirejs in combination with Typescript and AMD使用 requirejs 结合 Typescript 和 AMD 的相对路径
【发布时间】:2013-05-04 16:03:27
【问题描述】:

有几个 Javascript 文件,组织在文件夹 Scripts/folder1、Scripts/folder2...

使用 requirejs.config.baseUrl 将文件夹定义为默认文件夹,例如 Scripts/folder1。然后在 requirejs.config.paths 中,一些文件仅使用文件名进行寻址,而一些文件使用相对路径(如 ../folder2/blabla)进行寻址。

在对 Typescipt 文件 folder2/blabla.ts 进行编码时,我们需要来自 folder1 的模块“math”。所以我们写

import MOD1 = module("../folder1/math");

关于 Typescript,什么都可以。它可以找到模块。但是,使用 requirejs 存在问题。它不知道模块“../folder1/math”,它只知道“math”。

问题似乎是 import 语句需要一个文件名,从当前目录开始寻址。但是,这不是 requirejs 知道的模块 id。

在任何地方使用绝对路径,无论是在 requirejs 配置中还是在 Typescript 中的 import 语句中,都可以解决问题。

我做错了吗?或者是绝对路径?

【问题讨论】:

  • 我发现绝对路径或相对于需要 js 加载的第一个模块的路径(通常是我的 js 应用程序的根目录 - Scripts 文件夹或 Durandal 的 App 文件夹 - 但不是一定是我网站的根)工作。
  • 非常感谢您的回答。如果第一个模块位于 /Scripts 中,则 baseUrl 将设置为该路径。然后,如果使用“folder1”中的模块,关于 requirejs,它必须像“folder1/blabla”一样处理。然后你会在 Typescript 语句中写什么?你写模块(“folder1/blabla”)吗?如果写入import语句的模块保存在“folder2”中怎么办?那么 Typescript 是否接受模块(“folder1/blabla”)?
  • 是的。据我所知,无论您从何处导入,路径都不会改变(只要您仍然在同一个应用程序上下文中 - 所以仍然在从该初始基本 url 加载的模块链中)。

标签: requirejs typescript relative-path amd


【解决方案1】:

指定一个baseUrl 等同于你的Typescript 文件的根文件夹:

require.config({
    baseUrl: './scripts', 
 }
)

然后,当您使用从脚本文件夹开始的相对路径时,您可以像在 typescript 中通常那样进行导入,并且 requirejs 将使用相同的基本路径。

更新:此演示文稿应回答您所有的 url / 使用来自 Typescript 问题的 js:http://www.youtube.com/watch?v=4AGQpv0MKsA 代码:https://github.com/basarat/typescript-amd/blob/master/README.md

【讨论】:

  • 非常感谢您的回答。因此,在 requirejs 路径部分中,模块 ID 将是例如“文件夹/blabla”。这是一个标识符,不能与 import 语句一起使用。编写 module("folder/blabla") 将不起作用,因为 Typescript 的基本文件夹似乎是当前编辑的文件所在的文件夹。因此,如果当前编辑的 Typescript 文件在“另一个文件夹”中,则该语句将查找“另一个文件夹/文件夹/blabla”。
  • @mgs 我创建了一个演示文稿(请参阅更新)来回答您可能遇到的任何问题。如果它对我没有帮助,请告诉我。我不清楚您遇到的问题。
  • @mgs 您可以分叉项目并创建您遇到的错误情况。那我可以看看。
【解决方案2】:

在你需要的配置中为每个模块指定路径。那应该可以解决路径问题:

require.config({
    paths: {
        jquery: 'libs/jquery-1.7.1.min',
        jqueryui: 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min'
        // Other modules...
    }
});

【讨论】:

  • 非常感谢您的回答。如果一个模块是这样指定的,那么在Typescript中import语句要怎么写呢?如果当前编辑的 Typescript 文件在同一个文件夹中,它可以与 module("blabla") 一起使用,什么都可以。但是,如果它在另一个文件夹中,则必须使用类似 module("../folder/blabla") 的东西。然后 requirejs 对模块一无所知。
  • 这不是一个好的答案。必须将应用程序中使用的所有模块都写在“路径”对象中是很麻烦的。
猜你喜欢
  • 2013-01-10
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多