Пакет
У меня есть общая библиотека в виде пакета Meteor со следующей структурой:
ui
- componentA.html
- componentA.js
- loader.js
- ...
tools
- toolXY.js
- ...
и в то время как tools
совместно используются многими моими приложениями (и пользовательским интерфейсом) , часть 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
загрузчик. js (маленький помощник, думаю, в пакете 100 компонентов пользовательского интерфейса)
export const loader = {
componentA: {
template: 'componentA',
load: async function () {
return import('./componentA')
}
}
}
Поскольку пользовательский интерфейс используется только в одном приложении, я сделал 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
, хотя они не требуют я t.
Вопрос
Почему он так себя ведет? Разве это не должно работать со слабой зависимостью, когда зависимость добавлена в проект?