1

亲爱的 StackOverflow 用户,

我为浏览器微信小程序制作了一个模块。该模块是用多个 TypeScript 编写的,并被编译成一个缩小的文件。在该模块中,我需要使用 DOM/BOM API,例如document'window , 'navigator. 在浏览器上,加载和使用编译好的单文件没有问题。

但是在微信小程序上,没有globalNode上的对象。也没有浏览器上的document全局window对象。为了解决这个问题,我为每个环境做了两个构建命令。

  • grunt build, 浏览器的标准 TS 编译
  • grunt wx_build,标准TS编译并附加微信小程序补丁代码

修补后的 js 文件如下所示:

// mymodule-bundle.min.js

// patch
window=require("./miniapp-adapter/src/index.js");
document=require("./miniapp-adapter/src/document.js").default;

// original compiled/minified code
(function(f){if(typeof exports==="object"&&typeof module!=="undefined")...

在微信小程序项目中,我将mymodule-bundle.min.jsminiapp-adapter放在同一个文件夹中。结果,我可以将我的 HTML5 应用程序移植到微信小程序中。

但我想要一种更聪明的方法来做到这一点。

微信小程序运行时如何声明windowordocument全局变量?mymodule.ts

谢谢你。

4

1 回答 1

0

以下是您声明它们的方式:

declare const document: any
declare const window: any

为了在它们上获得更好的类型以进行智能感知,如果您需要消费者使用它们,您只需将它们设为代表您放在那里的内容的类型。否则你可以让他们这样。

在 Node 中,您可以这样做:

declare namespace NodeJS {
  export interface Global {
    window: any
    document: any
  }
}

global.window = require("./miniapp-adapter/src/index.js");
global.document = require("./miniapp-adapter/src/document.js").default;

但是,要在 Node 上惯用,您应该从模块中导出它们,而不是将它们加载到全局命名空间中。

于 2020-02-22T02:59:15.273 回答