从requirejs映射调用文本插件

时间:2012-12-16 23:46:52

标签: requirejs typescript requirejs-text

我正在使用TypeScript,Backbone和Mustache编写Web应用程序。我想使用Requirejs进行依赖加载。

我还使用了针对TypeScript的Web Essentials visual studio插件,并启用了AMD编译选项。对于那些不熟悉它的人,如果导入外部模块,它会将您的类型脚本文件包装在AMD模块中。 例如:

在类型脚本中,我在类型定义文件中导入以下模块。

export import Backbone = module("Backbone"); 
import mainTemplate = module("MainTemplate");

输出类似于:

define(["require", "exports", "Backbone", "MainTemplate"], function(require, exports, __Backbone__, __mainTemplate__) {
//...code goes here ...
});

对于模板,我在类型定义文件中声明了以下内容:

declare module "MainTemplate" { }

为了支持requirejs插件,您需要将模块声明为:

declare module "text!MainTemplate.html" { }

我想保持模块名称没有插件和文件扩展名。这将使我在未来具有一定的灵活性。

我在require中有以下映射。

require.config({
    map: {
        "MyModule": {
            "MainTemplate": "text!MainTemplate.html"
        }
    }
}

这成功调用了文本插件,但插件加载了错误的url。通过对文本插件的源代码进行筛选,我发现以下代码是罪魁祸首。

load: function (name, req, onLoad, config) {
  ...
  url = req.toUrl(nonStripName),
  //returns "scripts/**text!**MainTemplate.html**.html**"
  ...
}

如果我将模块命名为'MainTemplate.html',它可以正常工作,但我想将扩展名保留在模块名称之外。

我已经使用简单的正则表达式替换修改了文本插件,以去除插件引用和重复的扩展名。

有没有更好的方法来解决这个问题?

5 个答案:

答案 0 :(得分:11)

陷入类似的问题。终于解决了。见TypeScript: compiling removes unreferenced imports

/// <amd-dependency path="text!templates/application.htm" />

var applicationTemplate = require('text!templates/application.htm');

答案 1 :(得分:8)

对于Typescript 1.0,这对我有用。 首先,我创建了一个.d.ts文件,该文件存储了每个文本模板的所有模块声明。

//workaround for typescript's lack of support for requirejs text template notation
//remember that a reference to the import variable has to be found in the class, otherwise typescript ignores the import
declare module "text!views/details/details.html" {
    var text: string;
    export = text;
} 
declare module "text!views/layout/layout.html" {
    var text: string;
    export = text;
} 
declare module "text!views/home/home.html" {
    var text: string;
    export = text;
} 

然后引用文本模板我在类/模块的顶部添加这些行。

/// <reference path="../texttemplate.d.ts"/>
import detailsTemplate = require('text!views/details/details.html');

实际上并不需要参考线,因为.d.ts文件是全局拾取的。但我添加它作为解决方法的提醒。它还可以轻松地按住Ctrl键并单击以转到d.ts.文件。

答案 2 :(得分:4)

有一种更好的方法可以做到这一点(我正在使用typescript 2.0) 在此引用:https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html

此代码期望您的requirejs配置和插件设置正确:

/// <amd-dependency path="text!./about.html" name="template"/>
declare let template: string;

这有助于我将lagacy代码迁移到打字稿。

答案 3 :(得分:2)

从TypeScript 0.9.0开始,我认为您需要执行以下操作:

/// <amd-dependency path="text!templates/application.htm" />
declare var require:(moduleId:string) => any;
var applicationTemplate:string = require("text!templates/application.htm");

点击http://www.codebelt.com/typescript/typescript-amd-with-requirejs-tutorial/

了解详情

答案 4 :(得分:0)

我们在TypeScript应用程序中使用Backbone和require.js 我们没有使用

import backbone = module("Backbone")

语法,而是使用

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

引用,然后是BootStrapper 这样,&#39;文本!htmlfile.html&#39;语法与require.js完美配合。

我已经整理了一篇关于在TypeScript和AMD上使用require.js的博客: http://blorkfish.wordpress.com/2012/10/23/typescript-organizing-your-code-with-amd-modules-and-require-js/