Javascript 使用WebPack+;定义导入的外部模块;打字稿

Javascript 使用WebPack+;定义导入的外部模块;打字稿,javascript,jquery,typescript,webpack,Javascript,Jquery,Typescript,Webpack,我正在尝试用TypeScript和一些外部库设置WebPack,但遇到了一些问题 我正在导入jQuery的src版本,以便WebPack选择所需的模块(这是使Boostrap SASS加载程序工作所必需的),因此我在TS中导入库时如下所示: import jquery = require( 'jquery/src/jquery.js' ); 编译时,会抛出错误找不到外部模块“jquery/src/jquery”。如果我创建一个手动.d.ts文件来定义库,如下所示: declare module

我正在尝试用TypeScript和一些外部库设置WebPack,但遇到了一些问题

我正在导入jQuery的src版本,以便WebPack选择所需的模块(这是使Boostrap SASS加载程序工作所必需的),因此我在TS中导入库时如下所示:

import jquery = require( 'jquery/src/jquery.js' );
编译时,会抛出错误
找不到外部模块“jquery/src/jquery”
。如果我创建一个手动.d.ts文件来定义库,如下所示:

declare module "jquery/src/jquery"{}
然后编译器工作,但警告:

cannot invoke an expression whose type lacks a call signature
或者,如果我将导入行更改为

var jquery = require( 'jquery/src/jquery' );
(我认为这是一个常见的JS风格的导入?)然后所有的编译(和运行)都很好。因此,问题是:

  • 是否有更好的方法使用WebPack要求/包含源文件
  • 定义模块的正确方法是什么,这样它就不会缺少调用信号
  • 我是否应该担心使用
    var
    而不是
    import
    ,或者如果它起作用,就直接使用它
我刚刚拿起了这个网页,所以我完全有可能在做一些愚蠢的事情。如果是,请纠正我

编辑:

当我思考如何表达这个问题时,我想到:

declare module "jquery/src/jquery" { export = $; }
这似乎让我可以使用“导入…”-但这是处理这个问题的好方法吗

编辑2:

以下是对@basarat的回答的回复(我的评论有点长,没有换行):

我已经在使用DefinitelyTyped中的jquery定义,但它本身无法工作,因为我需要的模块是“jquery/src/jquery”,而不仅仅是“jquery”。如果我使用“jquery”,那么将加载jquery的编译dist版本,这不适用于引导加载程序

因此,我认为,
声明模块“jquery/src/jquery”{export=$;}
扩展了现有的定义,但使用了我需要从中加载它的路径

import jquery=require('jquery/src/jquery.js')


改用jquery的明确类型定义:它已经允许您执行
import jquery=require('jquery')

来回答我自己的问题,这就是我最后要做的

NB我不知道这是否是实现这一目标的“正确”方式(我怀疑不是),因此我愿意向任何有更好答案的人开放

在我的TS定义文件tsd.d.TS中,我有明确类型的jQuery定义:

/// <reference path="jquery/jquery.d.ts" />
编译器现在可以找到jQuery源文件

我还必须编辑一个jQuery源文件,以便WebPack编译器能够很好地使用它:selector.js默认情况下没有包含工厂函数,WebPack需要一个工厂函数

有一个错误,但我无法让它工作,所以我只是将selector.js中的代码更改为:

define([ "./selector-sizzle" ], function(){});

这一切都让人觉得有点不舒服。。。但它让我克服了这个特殊的障碍。

谢谢——不过我已经在使用这个定义了。我已经更新了我的问题并给出了答复。Tom,我正在努力解决这个问题-我似乎找不到一个好的源代码来说明如何在网页包/打字脚本构建中正确地包含第三方代码,如jQuery等。你愿意多分享一点你的解决方案吗?@JasonBrubaker我在下面添加了我的解决方案作为答案。希望有帮助!
define([ "./selector-sizzle" ], function(){});