使用 Leaflet 或任何带有 Typescript 和 webpack 的 js 库

Using Leaflet or any js library with Typescript and webpack

注:我找了很多都没有找到答案。

我正在尝试通过扩展 leaflet 创建地图库。但我认为我的问题是一般使用 js 库。我正在使用 webpackts-loader 来创建输出文件。

我已经安装了类型 @types/geojson@types/leaflet 并将它们移动到 modules 文件夹。

这是我的简单 Test1.ts 文件:

import * as L from './modules/@types/leaflet/index';
import { MyDataItem } from './MyDataItem ';

export class Test1 {
    text: string;
    data: MyDataItem ;
    latLng: L.LatLng;
   
    constructor(theName: string) {
        this.data = { name: theName} as MyDataItem ;
    }
    public show() {
        console.log(this.data.name);
    }

    public showLatLng() {
        this.latLng = new L.LatLng(22, 55);
        console.log(this.latLng);
    }
}

module.exports = {
    Test1: Test1
}

我在我的 webpack 输出选项中设置了 library:'lib'。 现在我从浏览器控制台调用以下方法:

> (new lib.Test1("aa")).show()        // result: aa
> (new lib.Test1("aa")).showLatLng()   // error : L.LatLng is not a constructor
// or if it set webpack optimization:minimize to true  the error is: i.LatLng is not a constructor

我已将 leaflet.js 添加到页面,因此 typeof(L.latlng)"function"latlng 带有小写字母)。

问题:很明显我在leaflet中使用的类型在生成js文件后无法访问。我的假设是如果你为任何 js 库创建 ts 声明文件 (.d.ts) 你可以在你的 ts 文件中使用该库.我在这里错过了什么?如何在 Typescript 文件中添加和使用普通的 js 库,以便它们在与 webpack?

捆绑后工作

通常的做法是在 node_modules 文件夹中同时安装 leaflet 及其关联的 @types/leaflet 软件包,并且只安装 import * as L from "leaflet"(或 import L from "leaflet",取决于你的 webpack 配置)。类型将自动可见。并且 webpack 会自动打包 Leaflet。

所有其他 JS 库都一样。

通过导入 只是 类型 (import * as L from './modules/@types/leaflet/index';),你确实告诉 TypeScript L 是什么意思,而不是 webpack。

如果出于某种原因你真的想自己添加 Leaflet 库,而不是让 webpack 将它与应用程序的其余部分捆绑在一起,那么你必须告诉 webpack保持 L 不变,因为您将以某种方式在全局范围内提供它。使用 externals 配置 webpack,例如:

module.exports = {
  //...
  externals : {
    "./modules/@types/leaflet/index": {
      root: 'L' // indicates global variable
    }
  }
};