在一个Typescript项目

时间:2018-02-24 08:40:02

标签: typescript webpack commonjs umd

我正在努力让Leaflet库与我的Typescript项目很好地配合。

我的项目遵循commonJs模式(在我的源文件中导入\ exports),但是当我使用webpack构建时,编译器从我的文件中给出了以下错误,我尝试访问L全局公开的传单模块

  

' L'是指UMD全局,但当前文件是一个模块。考虑   改为添加导入。

现在我可以解决这个问题,如果我将传单导入我的源文件中,如下所示:

import * as L from 'leaflet'

但是我想知道我是否可以在我的所有文件中全局访问t,而不必在每个文件中都有导入。

我有一个挖掘并找到了一些解决方法,您可以像这样声明自己的全局变量:

globals.d.ts

import * as L from "leaflet";

declare global {
  const L: L
}
export {};

我不确定这是否是推荐的,感觉有点脏,有没有正确的方法使用webpack配置为UMD模块提供为commonJs项目公开的全局变量,还是我在胡说八道?我承认我很难理解模块类型和它们的可互换性之间的差异,所以对我来说很容易!

1 个答案:

答案 0 :(得分:0)

在模块中,您可以导入其他模块或使用全局变量。无法一次将模块导入所有模块。如果你懒得在任何地方写入导入,那么你应该使用全局变量。

UMD模块系统是通用的。如果将其导入某个模块(CommonJS,AMD ...),则其行为类似于模块,即它不会填充全局范围。如果您希望UMD变为全局,则应将其添加为extern "C" { <rest of your class definition> } 到页面。然后,您可以使用<script>文件通知TypeScript,即全局范围内可用的leafet。那里没有任何黑客攻击(此外,使用全局范围而不是模块本身就是黑客攻击)。