您展示的原始代码调用匿名函数,为了有意义,它必须定义一个全局变量,而您展示的第二个代码片段仅导出该函数,这是另一回事。
出于讨论的目的,我们假设原始代码定义了一个像这样的全局:
// my-third-party-module.js
(function() {
let myVar = 22;
window.MyThirdPartyModule = { log: function() { console.log(myVar); } };
}.call(this);
你使用的是这样的:
// app.js
MyThirdPartyModule.log();
你可以把它改写成
// my-third-party-module.js
let myVar = 22;
export default { log: function() { console.log(myVar); } };
// app.js
import MyThirdPartyModule from `my-third-party-module';
MyThirdPartyModule.log();
请注意,我们已将匿名函数的本地变量 myVar 移动到顶级模块级别。
但是,根据您的喜好,您可能希望单独导出它的 API,而不是导出一个大对象(这是一种预模块的心态):
// my-third-party-module.js
let myVar = 22;
export function log { console.log(myVar); }
// app.js
import {log} from `my-third-party-module';
log();
或者如果你喜欢
// app.js
import * as MyThirdPartyModule from `my-third-party-module';
MyThirdPartyModule.log();
但是,所有这些方法都假定您能够并且愿意编辑第三方库的源代码。如果不是这样,你可以写一段胶水代码,比如
// my-third-party-module-interface.js
import 'my-third-party-module'; // This will run the module.
export default MyThirdPartyModule; // Export the global it defined.
// app.js
import MyThirdPartyModule from 'my-third-party-module-interface';
如果您希望再次导出单个 API,可以扩展胶水以重新导出每个 API:
// my-third-party-module-interface.js
import 'my-third-party-module'; // This will run the module.
const {log, otherAPI, ...} = MyThirdPartyModule;
export {log, otherAPI, ...};
// app.js
import {log} from 'my-third-party-module-interface';