webpack yarn:导出为正常ES6模块

np8igboo  于 2023-06-23  发布在  Webpack
关注(0)|答案(2)|浏览(168)

举一个简单的例子:

const myFunc = () => console.log("foo");
export const funcs = {myFunc};

我希望能够导入这个与浏览器的import()函数,并能够访问mod.funcs
如果我直接在浏览器中导入源代码,一切都可以正常工作。但是,我如何让yarn构建一个仍然可以导入的版本呢?
如果我尝试构建那个版本,那么编译后的版本就是(()=>{"use strict"})();,根本没有这个函数。
我也试过:

module.exports = {myFunc};

这似乎产生了一些代码,其中包括功能,但我仍然无法访问它导入后,在浏览器中。
用Yarn构建,它叫react-scripts build
我正在尝试构建的完整应用程序:
应用程序需要能够导入任意用户定义的JS模块来提供定制。目前,这是通过以下方式完成的:

import(/* webpackIgnore: true */ js_module).then((mod) => {
        Object.assign(COMPONENTS, mod.components);
        Object.assign(USER_FUNCS, mod.funcs);
    });

https://github.com/aio-libs/aiohttp-admin/blob/master/admin-js/src/App.js#L77
这应该适用于vanilla JS模块(例如添加可以用于验证器的简单函数),而无需构建工具。这目前工作正常,例如这个模块加载没有问题,添加一个新的功能到应用程序:https://github.com/aio-libs/aiohttp-admin/blob/master/examples/validators.py#L15-L21
它还需要与React模块一起工作,以便可以将自定义的react-admin组件添加到components对象中。这是我努力打造的部分。如果我构建并导出一个组件作为模块,当我将其加载到应用程序时,我会从React的useContext()中得到错误,我认为这是因为用户模块中的上下文与应用程序中的上下文不同。
为了测试,我主要复制了CloneButton的代码(一旦某些东西实际工作,我会修改它):https://github.com/marmelab/react-admin/blob/61555343ac1d325effc75f21591c422c7825e918/packages/ra-ui-materialui/src/button/CloneButton.tsx是useResourceContext()、useRecordContext()等。在React的useContext()中失败。

pxq42qpu

pxq42qpu1#

图书馆模式可能是你正在寻找的。尝试将这些行添加到webpack.config.js中:

module.exports = {
    // ...
    output: {
        // ...
        globalObject: 'this',
        library: {
          name: 'myLibrary',
          type: 'umd',
        },
    }
}

这将告诉webpack公开您导出的函数。根据需要更改库名称。

dddzy1tm

dddzy1tm2#

至少对我来说,你的项目环境有点不寻常,但根据你的更新和代码示例,我认为你所寻找的肯定需要react-scripts eject,因为你最终需要自定义你的webpack和babel配置。
你可能知道,但值得提醒的是,这是一个一次性的,不可逆的行动。
作为独立的vanilla JS模块使用,可能会继续使用我最初工作的其他答案的输出配置。
对于React组件,只需按照建议将组件文件复制到dist/文件夹(或任何输出文件夹)的子文件夹中即可。您可以使用CopyWebpackPlugin来实现这一点。
我希望它能为您提供最终解决方案的跟踪。如果你有更多关于webpack或JS模块的问题,请不要犹豫,我很乐意帮助你。

相关问题