我有一个共享库,如Meteor包,结构如下:
ui
- componentA.html
- componentA.js
- loader.js
- ...
tools
- toolXY.js
- ...
,虽然tools
在我的许多应用程序(和ui)中共享,但ui
部分仅由一个应用程序使用。认为模板非常简单:
componentA.html
<template name="componentA">
<span>yea component A</span>
</template>
componentA.js
import { Template } from 'meteor/templating'
import { toolXY } from '../tools/toolXY'
import './componentA.html'
// ... template code
loader.js(小帮手,认为该程序包包含100个ui组件)
export const loader = {
componentA: {
template: 'componentA',
load: async function () {
return import('./componentA')
}
}
}
因为ui仅在一个应用程序中使用,所以我将templating
和dynamic-import
变成了弱依赖项:
Package.onUse(function (api) {
api.versionsFrom('1.6')
api.use('ecmascript')
api.use('dynamic-import', ['client'], { weak: true })
api.use('templating', ['client'], { weak: true })
})
我通过以下方式将软件包和弱依赖项添加到项目中
$ meteor add dynamic-import templating me:mypackage
并按如下所示在客户端上导入用户界面:
client / main.js
import { loader } from 'meteor/me:mypackage/ui/loader'
Meteor.startup(() => {
loader.componentA.load()
.then(() => console.log('loaded'))
.catch(e => console.error(e))
})
这将导致以下错误:
Error: "Cannot find module './componentA.html'"
makeMissingError http://localhost:5050/packages/modules-runtime.js?hash=23fe92393aa44a7b01bb53a510a9cab5fb43037c:232
resolve http://localhost:5050/packages/modules-runtime.js?hash=23fe92393aa44a7b01bb53a510a9cab5fb43037c:238
moduleLink http://localhost:5050/packages/modules.js?hash=88e9e724ccc8459066fbe9e3889ef37c7bb7067f:353
module /node_modules/meteor/me:mypackage/ui/componentA.js:16
makeModuleFunction http://localhost:5050/packages/dynamic-import.js?hash=cf582bcc349503492678c9fd3f7bba4a610f70e5:138
fileEvaluate http://localhost:5050/packages/modules-runtime.js?hash=23fe92393aa44a7b01bb53a510a9cab5fb43037c:346
require http://localhost:5050/packages/modules-runtime.js?hash=23fe92393aa44a7b01bb53a510a9cab5fb43037c:248
moduleLink http://localhost:5050/packages/modules.js?hash=88e9e724ccc8459066fbe9e3889ef37c7bb7067f:360
getNamespace http://localhost:5050/packages/dynamic-import.js?hash=cf582bcc349503492678c9fd3f7bba4a610f70e5:187
dynamicImport http://localhost:5050/packages/dynamic-import.js?hash=cf582bcc349503492678c9fd3f7bba4a610f70e5:40
检查Package.templating
内的loader.js
以及componentA.js
会解析为Object { Template: Template(viewName, renderFunction) }
(因为它已作为软件包安装到项目中)。
如果我关闭对templating
的弱依赖关系,它将正常工作:
api.use('templating')
但是,这将导致我所有的应用程序都加载templating
,尽管它们并不需要。
为什么会这样?当依赖项已添加到项目中时,这不应该在弱依赖项下起作用吗?