如何用ES6/TC39提案特性覆盖第三方库的指定命名导出?
用ES6标准特性轻松实现覆盖式导出
当然可以用标准ES6模块特性实现,完全不用手动写那99个导出,而且根本不需要依赖CommonJS或者实验性的TC39 Stage特性!
核心实现思路
ES6模块的export *语法可以帮你一次性转导出目标库的所有命名导出,之后你只需要单独导出要覆盖的那个成员——因为显式导出的成员优先级高于export *带来的同名导出,自然就完成了覆盖。
具体代码示例
假设你要覆盖supportlibrary里的targetFunction,只需要在compat-library的入口文件里这么写:
// 第一步:转导出supportlibrary的所有命名导出 export * from 'supportlibrary'; // 第二步:显式导出要覆盖的成员,它会替换掉上面来自supportlibrary的同名导出 export const targetFunction = () => { // 这里写你的自定义逻辑 console.log("这是覆盖后的targetFunction"); // 如果需要复用原函数逻辑,也可以先单独导入原函数: // import { targetFunction as originalTargetFunction } from 'supportlibrary'; // return originalTargetFunction(...args); };
为什么这可行?
这是ES6模块的标准行为:export * from 'module'会将目标模块的所有命名导出(除了默认导出)转导出到当前模块,但如果当前模块有同名的显式导出,显式导出会被优先使用,相当于自动覆盖了原库的对应成员。
CommonJS的实现方式(对比参考)
如果你用CommonJS的话,也可以实现,但写法相对繁琐一些:
// 导入原库的所有导出 const supportLib = require('supportlibrary'); // 覆盖目标成员 supportLib.targetFunction = () => { console.log("这是覆盖后的targetFunction"); }; // 导出修改后的对象 module.exports = supportLib;
但显然ES6模块的方式更符合现代JS的语法规范,也更简洁。
内容的提问来源于stack exchange,提问作者Dennie de Lange
相关产品推荐
相关产品推荐

