ES6模块并兼容非模块js

问题描述 投票:0回答:1

我想知道是否有一些方法可以制作非模块 JS,例如:

// my-api.js
function MyAPI() {
   this.classVar = null
}

MyAPI.prototype.myFunction = function() {
  this.classVar = {something: 3}
}

兼容ES6模块。我尝试将此代码放入

my-api.js

if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
  module.exports = MyAPI
}

但是当我尝试导入时,无论是使用

The requested module '/static/my-api.js' does not provide an export named 'MyAPI'
还是
import MyAPI from '<url-of-backend>/static/my-api.js
,我都会得到 
import { MyAPI } from <url-of-backend>/static/my-api.js

我偶然发现了https://stackoverflow.com/a/58615189/8204956这个响应,但它需要另一个间接级别。

我正在尝试使非模块 JS 与 es6 模块兼容,以便在大型代码库中顺利迁移到模块。

javascript browser es6-modules
1个回答
0
投票

如果您这样做是为了过渡到 ES6 模块,一个想法是将您的 API 放入

globalThis
,通过这样做,您使用什么模块加载器并不重要。

例如。

globalThis.myAPI = ......

然后你使用什么模块加载器并不重要 ->

import "./my-api"
<script src="./my-api"/>
require("./my-api")
等等 ->

const api = new globalThis.MyAPI(); //this will work no matter what loader

需要注意的是,请确保您不使用全局中已经存在的函数,

MyAPI
应该没问题,但执行
globalThis.atob
等可能会导致问题。

然后当您过渡到使用 ES6 时,您可以逐渐删除它们。

© www.soinside.com 2019 - 2024. All rights reserved.