讓我們假設我們的依賴項具有以下package.json描述:
{
"name": "some-dependency",
"exports": {
".": {
"browser": {
"import": "...",
"require": "..."
},
"node": {
"import": "...",
"require": "..."
},
}
}
}
我怎樣才能讓 webpacknode只為單獨決議匯出some-dependency?我試過這樣的事情:
module.exports = {
// ...
resolve: {
extensions: [".jsx", ".js"],
conditionNames: ["node", "some-dependency"],
},
};
但它適用于全球,似乎并沒有做正確的作業。
uj5u.com熱心網友回復:
該conditionNames屬性與優先順序無關。它是關于使用哪些欄位。優先級順序由exports物件鍵順序決定。
此外,在您的情況下,不可能通過任何 Webpack 配置來實作這一點。您必須構建自己的插件以使用enhanced-resolver. 例如:
const { readFileSync } = require('fs');
const path = require('path');
// The module for which you need custom resolution
const targetDependency = 'some-dependency';
class MyCustomResolver {
constructor(source, target) {
this.source = source;
this.target = target;
}
apply(resolver) {
const target = resolver.ensureHook(this.target);
resolver
.getHook(this.source)
.tapAsync('MyCustomResolver', (request, resolveContext, callback) => {
// Any logic you need to create a new `request` can go here
let newRequest = { ...request };
if (request.request === targetDependency) {
// Modify your newRequest object here.
// Step 1: Read package.json of `some-dependency`.
const json = JSON.parse(readFileSync(`node_module/${targetDependency}/package.json`));
// Step 2: Extract required object
const node = json.exports['.'].node;
// Step 3: Modify newRequest object (Example only)
newRequest.request = path.join(__dirname, 'node_modules', node.require);
// Step 4. Modify additional param of request object if any
}
// Call the resolution function.
resolver.doResolve(target, newRequest, null, resolveContext, callback);
});
}
}
module.exports = {
resolve: {
plugins: [
MyCustomResolver
]
}
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/496211.html
