【发布时间】:2021-01-29 19:16:01
【问题描述】:
几天以来,我一直在尝试构建一个节点模块,该模块将被 React 应用程序使用。
今天我的模块被打包成一个用 webpack 打包的大 javascript 文件。
此节点模块的某些部分是可选的,仅当我们想要使用某些功能(通过配置激活)时才需要。为了避免加载不必要的代码部分,我首先尝试按照 webpack 的解释使用 chunking 和 dynamic import 但这并没有工作:在dist/ 文件夹中创建和打包块,但是当从反应应用程序调用时,我从未成功在节点模块中运行动态导入。应用程序抱怨无法从应用程序加载块。这对我来说很有意义,因为这个 webpack 功能更多地是为了动态加载应用程序的一部分,而不是作为节点模块依赖项按需加载代码的内部机制(但我可能是错的)。
我查看了其他项目,如 babel 或 react-router,其中模块使用 lerna 和 yarn 拆分为多个包包。所以我尝试用 lerna 和不同的包来构建库:
my-library
core/
src/
index.js
another-package/
src/
index.js
我希望 core 中的 index.js 文件仅在需要且仅在安装了节点模块 @my-library/another-package 的情况下才能从 index.js 从 another-package 调用方法。但我从来没有找到解决方案。
是否可以通过ES5/ES6 和webpack/lerna 实现这一目标,还是我采取了错误的方法?
10 月 27 日更新
所以经过几次测试,我能够使用带有纯 HTML/JS (https://github.com/PixelDuck/lerna-webpack/blob/main/a-react-app/src/client/test.html) 的 Aram 解决方案,但该解决方案不适用于带有 webpack https://github.com/PixelDuck/lerna-webpack/blob/main/a-react-app/src/client/App.js 的 React 应用程序包。
代码可在此处获得:https://github.com/PixelDuck/lerna-webpack。
打开终端到my-lerna-library 并运行
yarn install
yarn link:all,这将为每个包创建符号链接
`yarn dev',这将创建包并监听变化
然后打开一个新终端到文件夹a-react-app:
yarn install
yarn link "my-lerna-library"
yarn link "@my-lerna-library/another-package"
`纱线开发`
将在http://0.0.0.0:3000 上打开一个页面,您将看到模块@my-lerna-library/another-package 未找到。
如果你打开http://0.0.0.0:5000/test.htmlplainJS 测试,一切看起来都很好。
似乎问题出在 react 应用程序的 webpack 方面,因为在调试应用程序时,我可以看到核心包正在寻找库名称 my_lerna_library__WEBPACK_IMPORTED_MODULE_3__,这不是 webpack 在加载另一个时使用的库名称包_my_lerna_library_another_package__WEBPACK_IMPORTED_MODULE_2___default
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
/* harmony import */ var _App_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./App.css */ "./src/client/App.css");
/* harmony import */ var _App_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_App_css__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _my_lerna_library_another_package__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @my-lerna-library/another-package */ "../my-lerna-library/packages/another-package/dist/index.bundle.js");
/* harmony import */ var _my_lerna_library_another_package__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_my_lerna_library_another_package__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var my_lerna_library__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! my-lerna-library */ "../my-lerna-library/packages/core/dist/index.bundle.js");
/* harmony import */ var my_lerna_library__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(my_lerna_library__WEBPACK_IMPORTED_MODULE_3__);
【问题讨论】:
标签: javascript node.js reactjs webpack lerna