【发布时间】:2020-11-15 02:10:51
【问题描述】:
我正在尝试通过vue-cli-service 在 Vue 中构建一个模块化应用程序。主应用程序和模块是位于不同文件夹中的独立项目,结构如下:
-- app/package.json
/src/**
-- module1/package.json
/src**
-- module2/package.json
/src**
这个想法是让 Vue 应用程序完全不知道运行时可能存在的应用程序模块,这些模块本身使用 vue-cli-service build --target lib 在本地 moduleX/dist 文件夹中编译,并使用 package.json “main”和“文件”节点。
我的第一个想法(现在只是为了提高开发速度)是将模块作为本地 NPM 包添加到应用程序中,使用 watcher 构建它们并使用 watcher 本身为应用程序提供服务,这样对依赖模块的任何更改都会(我认为)自动分发到主应用程序。
所以应用程序的package.json 包含如下依赖项:
...
"module1": "file:../module1",
"module2": "file:../module2",
...
这些依赖项意味着可以随时删除,或者通常根据我们的需要进行组合,应用程序只需重新编译,一切都应该正常工作。
我现在正试图了解如何在应用程序中动态加载和激活模块,因为我不能像这样使用动态导入:
import(/* webpackMode: "eager" */ `module1`).then(src => {
src.default.boot();
resolve();
});
因为基本上我不知道'module1','module2'等......
在 OOP 世界中,我只会使用依赖注入检索实现特定接口的类,但在 JS/TS 中我不确定它是否可行。
有办法做到这一点吗?
【问题讨论】:
-
在构建时而不是在运行时限制模块集的原因是什么?我的意思是您可以轻松地让 webpack 将每个模块构建到自己的块中,然后在运行时决定加载哪个模块(基于一些 json 配置)...
-
@MichalLevý 这正是我不知道该怎么做。尝试使用动态导入,正如您在问题上看到的那样,我仍然有问题对“module1”、“module2”等字符串进行硬编码......我想要这样的东西:“导入所有暴露这个的模块界面”。或者 JS 中的等价物。
标签: javascript vue.js npm vue-cli-3 modularity