我正在开发一个框架和一个打包器。打包器会用babel的@babel/preset-env
预设将ES6模块代码转换为CommonJS。
对于框架,我有3个文件夹,dom
,reactive
和framework
。
framework
导入dom
和reactive
的所有导出并重新导出。
一样:
export {
useState,
createEffect,
} from '../reactive/index.js'
export {
createElement,
createComponent,
convertToNode,
insert,
render
} from '../dom/index.js'
这样,当你使用这个框架的时候,你就可以从framework
中导入你需要的一切了。
示例用例:
import { useState } from 'framework';
const Component = () => {
const [ count, setCount ] = useState(0);
//...rest of component...
}
但是,当我重新导出绑定的代码时,会抛出这个错误:
Uncaught TypeError: Cannot set property useState of #<Object> which has only a getter
我知道为什么会这样做(因为babel只使用getter创建导出),但我需要知道如何绕过它/正确构建我的项目。
如何解决这个问题,
- 切换到插件
@babel/plugin-transform-modules-commonjs
- 在插件设置中设置
loose: true
:
const { code } = babel.transformSync(beforeCode, {
plugins: [ ["@babel/plugin-transform-modules-commonjs", {
loose: true,
}] ],
});