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我实现了这样的逻辑
- 挂钩
compiler.hooks.beforeCompile
并使用 parser.hooks.importSpecifier
和 找到所有导入的转译模块
- 然后使用相同的
compiler
钩子,我找到所有 CallExpression
并记住所有将被转译的函数及其位置
- 在
compilation.hooks.buildModule
中的 compiler.hooks.compilation
中,我添加了模板依赖项,它将用 MemberExpression 替换 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} */`));
还在想有没有更好的解决办法
我正在写插件,内联一些代码。我在使用内部 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我实现了这样的逻辑
- 挂钩
compiler.hooks.beforeCompile
并使用parser.hooks.importSpecifier
和 找到所有导入的转译模块
- 然后使用相同的
compiler
钩子,我找到所有CallExpression
并记住所有将被转译的函数及其位置 - 在
compilation.hooks.buildModule
中的compiler.hooks.compilation
中,我添加了模板依赖项,它将用 MemberExpression 替换 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} */`));
还在想有没有更好的解决办法