HarmonyImportSpecifierDependency 的问题

Trouble with HarmonyImportSpecifierDependency

我正在写插件,内联一些代码。我在使用内部 webpack 插件时遇到了麻烦

简介

我的目标是转译这段代码

// a.js

export const getFoo = x => x.foo;

// b.js
import {getFoo} from './a.js';

export const func = x => getFoo(x);

到这个


// b.js
export const func = x => x.foo;

使用this comment我实现了这样的逻辑

  1. 挂钩 compiler.hooks.beforeCompile 并使用 parser.hooks.importSpecifier
  2. 找到所有导入的转译模块
  3. 然后使用相同的 compiler 钩子,我找到所有 CallExpression 并记住所有将被转译的函数及其位置
  4. compilation.hooks.buildModule 中的 compiler.hooks.compilation 中,我添加了模板依赖项,它将用 MemberExpression
  5. 替换 CallExpressions

问题

Webpack 有内部插件 HarmonyImportSpecifierDependency。显然,它用相同的逻辑替换

import {getFoo} from './a.js';

export const func = x => x.foo;

"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return func; });
/* harmony import */ var _getters_uno__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);

const func = x => {
  // NEXT LINE IS THE RESULT OF `HarmonyImportSpecifierDependency` WORK
  return Object(_getters_uno__WEBPACK_IMPORTED_MODULE_0__[/* getFoo */ "e"])(x);
};

我的问题是两个插件(我的和 HarmonyImportSpecifierDependency)都记得 CallExpression 的原始来源和原始位置。两个插件的结果都是无效代码:

return Object(_getters_uno__WEBPACK_IMPORTED_MODULE_0__[/* getFoo */ "e"])x.foo);

问题

有什么方法可以为我的插件提供 HarmonyImportSpecifierDependency 结果吗?我试图在 compilation 阶段重新解析模块,但没有成功

我通过在 succeedBuild 挂钩

中修补源中的 replacements 对象解决了我的问题
source.replacements = source.replacements
  .filter(r => !r.content.includes(`/* ${callExpression.callee.name} */`));

还在想有没有更好的解决办法