3

包裹

我有一个共享库作为 Meteor 包,具有​​以下结构:

ui
  - componentA.html
  - componentA.js
  - loader.js
  - ...
tools
  - toolXY.js
  - ...

虽然tools在我的许多应用程序(和 ui)之间共享,但该ui部分仅由一个应用程序使用。考虑模板非常简单:

组件A.html

<template name="componentA">
  <span>yea component A</span>
</template>

组件A.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

并在客户端上导入 ui,如下所示:

客户端/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.templatinginside loader.js,以及componentA.js解析为Object { Template: Template(viewName, renderFunction) }(因为它已作为包安装到项目中)。

不是真正修复的修复

如果我关闭templating对它的弱依赖将正常工作:

api.use('templating')

然而,这将导致我所有的应用程序加载templating,尽管它们不需要它。

问题

为什么会这样?当依赖项已添加到项目中时,这不应该适用于弱依赖项吗?

4

0 回答 0