如何使用Typescript和Webpack捆绑纯javascript依赖项



我有一个带有Webpack的简单Typescript web应用程序,我正在尝试包含一个不导出任何模块/函数的纯javascript库。说明要求您添加一个Script标记,这会将对象和函数添加到全局参数中,这些全局参数可以在整个应用程序中使用。与其这样做,我更想使用webpack将其捆绑在最终的javascript捆绑包中,并使其公开的对象和函数在全局中可用(这样它就可以以相同的方式使用(。

到目前为止,我能让webpack在捆绑包中包含javascript的唯一方法是在我的index.ts:中添加以下内容

require("./lib/exolve-m")

当它封装javascript时,它将其封装在一个公开导出的函数中(应该如此(。然而,这个包没有使用export关键字,而且它们也没有加载到全局命名空间中。因此,我只能使用无法访问的捆绑代码。

请问做这件事的正确方法是什么?

TL;DR:这个库与js/ts模块系统不兼容。你必须修改它。


它声称以下内容:

* The Exolve code creates only the following names at global scope:
*
* - Exolve
* - createExolve
* - createPuzzle (deprecated).
* - exolvePuzzles

但它的方法是在根文件范围内声明变量。当web浏览器通过<script>标记直接包含此文件时,此技术会创建全局变量。

// Run this in your browser console:
var foo = 123
console.log(window.foo) // returns: 123

这通常被认为是一种糟糕的做法,在像Webpack这样的打包程序出现之前,将代码封装在函数中是一种常见的做法,以防止这种行为并避免污染全局范围。

(function() {
var bar = 123;
console.log(window.bar); // returns undefined
})()

但是,可悲的是,这就是exolve库依赖于这种创建全局的方法来工作的行为。


然而,当您使用打包器时,这一切都会发生变化。Bundlers将所有导入的文件包装在函数中,可以调用这些函数来获取该文件的内容。这完全打破了这种创建全局的方法,因为var语句不再在全局范围内。

因此,当您将其作为一个模块导入时,它会在该模块内部创建一组局部变量,不导出任何内容,并且不修改全局范围。因此根本没有办法访问库中的代码。

这意味着此库与作为模块导入不兼容。


我认为您最好的选择是修改库。只需在要使用的声明中添加一个export即可。例如,替换:

function Exolve(puzzleText,
containerId="",
customizer=null,
addStateToUrl=true,
visTop=0,
maxDim=0)

带有

export function Exolve(puzzleText,
containerId="",
customizer=null,
addStateToUrl=true,
visTop=0,
maxDim=0)

现在你可以像其他模块一样导入项目:

import { Exolve } from "./exolve-m";

此处的工作示例

最新更新