如何使用typescript设置require.js配置?

Dou*_*oug 24 requirejs typescript

好的,我一直在阅读很多关于此的问题和答案,其中很多都是垃圾.

我有一个非常简单的问题.我该怎么做相当于这个:

require.config({
    paths: {
        "blah": '/libs/blah/blah',
    }
}); 
require(['blah'], function(b) {
    console.log(b); 
});
Run Code Online (Sandbox Code Playgroud)

打字稿?

这不起作用:

declare var require;
require.config({
    paths: {
        "blah": '/libs/blah/blah',
    }
});
import b = require('blah');
console.log(b);

s.ts(8,1): error TS2071: Unable to resolve external module ''blah''.
s.ts(8,1): error TS2072: Module cannot be aliased to a non-module type.
error TS5037: Cannot compile external modules unless the '--module' flag is provided.
Run Code Online (Sandbox Code Playgroud)

使用--module标志进行编译,使用虚拟blah.ts shim编译,但输出为:

define(["require", "exports", 'blah'], function(require, exports, b) {
    require.config({
        paths: {
            "blah": '/libs/blah/blah'
        }
    });

    console.log(b);
});
Run Code Online (Sandbox Code Playgroud)

看起来它可能有用,但实际上没有,require.config require块内,它已经需要之后设置.

所以!到目前为止,我已将此作为解决方案:

class RequireJS {

    private _r:any = window['require'];

    public config(config:any):void {
        this._r['config'](config);
    }

    public require(reqs:string[], callback:any):void {
        this._r(reqs, callback);
    }
}

var rjs = new RequireJS();
rjs.config({
    paths: {
        "jquery": '/libs/jquery/jquery',
        "slider": '/js/blah/slider'
    }
});

rjs.require(['slider'], function(slider) {
    console.log(slider);
});
Run Code Online (Sandbox Code Playgroud)

这看起来很可怕.

所以要清楚,在相互依赖的模块内部,这种事情完全正常:

import $ = require('jquery');
export module blah {
   ...
}
Run Code Online (Sandbox Code Playgroud)

我只需要一个正确的方法来将requirejs配置设置在顶层,这样各个命名模块的导入路径就是正确的.

(...这是因为,很大程度上,第三方依赖关系是使用bower解决的,并安装在/ lib/blah中,其中我的定义的shim文件位于src/deps/blah.d.ts,因此,将生成的模块文件移动到站点上的/ js /后,默认导入路径不正确)

NB.我在这里提到过jquery,但问题在于jquery不能作为AMD模块使用属性; 我有一个shim jquery.ts.d文件.这里的问题是requirejs路径.

Ed *_*nay 8

昨天我在我的博客上写了一个解决这个问题的解决方案 - http://edcourtenay.co.uk/musings-of-an-idiot/2014/11/26/typescript-requirejs-and-jquery:

TL; DR - 创建一个config.ts类似于以下内容的配置文件:

requirejs.config({
    paths: {
        "jquery": "Scripts/jquery-2.1.1"
    }
});

require(["app"]);
Run Code Online (Sandbox Code Playgroud)

并确保您的RequireJS入口点指向新的配置文件:

<script src="Scripts/require.js" data-main="config"></script>
Run Code Online (Sandbox Code Playgroud)

现在$,您只需使用,就可以在TypeScript文件中使用命名空间

import $ = require("jquery")
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助


bas*_*rat -4

如果你想使用importjavascript 模块,你需要告诉 typescript ,所以,

declare var require;
require.config({
    paths: {
        "blah": '/libs/blah/blah',
    }
});

// Important, place in an external.d.ts: 
declare module 'blah'{
   // your opportunity to give typescript more information about this js file
   // for now just stick with "any"
   var mainobj:any;
   export = mainobj;
}

import b = require('blah');
console.log(b);
Run Code Online (Sandbox Code Playgroud)

或者你可以简单地这样做:

var b = require('blah');它应该也能工作