Я новичок в babel, я создаю библиотеку, я хочу, чтобы люди импортировали мою библиотеку с помощью моего макроса, чтобы они получали оптимизированную версию, основанную на среде, и я знаю, что могу добиться этого, используя условные module.exports
, но я хочу использовать экспорт es6 для достижения tree-shaking
.
Поэтому я хочу сделать следующие вещи:
import { sum, add } from 'myLibrary/macro'; // I'm going to change this line
import otherLibrary from 'otherLibrary/macro';
sum([1,2,3])
Код выше приведен ниже.
import { sum, add } from "myLibrary/production"; // `macro` keyword replaced
import otherLibrary from 'otherLibrary/macro';
sum([1, 2, 3]);
Теперь я написал обычную версию Babel:
export default function(babel) {
return {
visitor: {
// All my `ImportDeclaration` gets processed.
ImportDeclaration(path) {
if (path.node.source.value.includes("myLibrary")) {
const someCondition = true; // I actually want to use `process.env.NODE_ENV === "production"`
if (someCondition) {
path.node.source.value = "myLibrary/production";
} else {
path.node.source.value = "myLibrary/development";
}
}
}
}
};
}
Я могу легко выполнить свое условие, просто возвращая объект visitor
, и все мои ImportDeclaration
обрабатываются, но в babel macros
Кажется, что я не могу легко достичь этого:
module.exports = createMacro(myMacro);
function myMacro({ references, state, babel }) {
const someCondition = true; // I actually want to use `process.env.NODE_ENV === "production"`
state.file.path.node.body.forEach(node => { // I need to `forEach` by my self.
if (node.type === "ImportDeclaration") {
if (node.source.value.includes("myLibrary")) {
if (someCondition) {
node.source.value = "myLibrary/production";
} else {
node.source.value = "myLibrary/development";
}
}
}
});
return { keepImports: true };
}
Есть ли какой-нибудь простой способ добиться того же в babel macros
?