【问题标题】:Aurelia external resourcesAurelia 外部资源
【发布时间】:2017-06-17 03:16:19
【问题描述】:

我正在寻找最好的方式来安排我的代码库以及在不同项目之间共享的公共资源。我有三个 aurelia 应用程序。在每一个中,我在其资源文件夹中添加了一些资源(自定义元素、属性等)。当我需要一个已经在另一个项目中写过的东西时,我只是粘贴了它。现在我有时间重构,我想将所有这些资源移动到一个专用的存储库中。然后我希望能够在每个项目中只选择我需要的资源。

我已经尝试将我所有的资源放在一个 repo 中,其中包含 aurelia 骨架的 gulp 构建任务,它允许我构建我所有模块的 AMD 模块。然后,我可以通过将它们添加到 aurelia.json 来单独加载一些模块。以属性为例:

{
  "name": "aurelia-resources-progress-button",
  "path": "../node_modules/SHG-aurelia-resources/dist/amd/resources/attributes",
  "main": "progress-button"
}

或自定义元素:

{
  "name": "aurelia-resources-avatar-upload",
  "path": "../node_modules/SHG-aurelia-resources/dist/amd/resources/elements/avatar-upload",
  "main": "avatar-upload",
  "resources": [
    "avatar-upload.html",
    "avatar-upload.css"
  ]
}

它就像一个魅力,但它对于从相对路径导入模块的值转换器失败。 文件位于:

"projectRoot/node_modules/SHG-aurelia-resources/dist/amd/resources/value-converters/duration-format.js", 它从'../utils./strings'导入

我在运行时收到以下错误:

“错误:ENOENT:没有这样的文件或目录,打开 '/Users/hadrien/Documents/dev/SportHeroes/united-heroes/src/resources/utils/strings.js'”。

奇怪的是,当我需要模板中的相关模块时(例如在我的进度按钮自定义属性中)没有问题。

我不想制作插件,因为我不想加载我的 repo 的每个模块。如果可能的话,我想要的是能够设置 .feature('../node_modules/path/resources') 并像加载本地资源一样加载它们。

我该怎么办?

【问题讨论】:

  • 为什么不想使用插件?插件和功能的 API 几乎相同。您已经通过 NPM 包分发资源,因此正确的方法是通过插件 API。
  • 因为我不想加载每个模块。想象一下,我的外部资源中有 10 个模块。 App A 使用 10,我可以使用插件。但是 App B 只使用了 2 个模块,我只想加载这两个。
  • 使用插件时不必“加载每个模块”。
  • 是吗?如何选择我要加载的模块?
  • 给我一点时间,我会写一个答案。 :-)

标签: npm resources structure aurelia


【解决方案1】:

我正在回答上面 cmets 中重新措辞的问题。

如果你有一个 npm 包,你可以简单地使用 require 元素从它中获取资源。这个 npm 包可以将自己打包为一个插件,你只需选择不以这种方式加载它,因为你只想要它提供的东西的一个子集。

我创建了一组示例项目来展示这一点:https://github.com/AshleyGrant/sample-app-so41961759

此应用程序依赖于https://github.com/AshleyGrant/sample-resources-so41961759/

此依赖项将自身打包为插件,但也可以像我在应用程序中所做的那样,仅使用插件具有的两种资源之一来零碎地使用它。请注意,其他资源没有加载,因为我没有使用它。

当我从依赖项中拉取资源时,这就是应用程序中的样子:

<template>
  <require from="sample-resources-so41961759/custom-elements/my-echo"></require>
  <h1>${message}</h1>

  <my-echo say="Echo!"></my-echo>
</template>

【讨论】:

  • 好的,但是我必须为每个模块创建任何新的存储库,所以。我打算把它们都放在一个存储库中……
  • 我发布的存储库中有两个资源。您可以将任意数量的资源放入存储库中。
  • 好的,但是如果我的应用只需要MyEcho,我将加载插件,如果我不使用它,它也会在供应商捆绑事件中添加MyShow。如果我不想让我的资源全球化?如果我想从包名的相对路径中要求/导入它们,比如sample-resources-so41961759/custom-elements/my-echo?
  • 那么你很有可能必须设置 tree shaking 并学习 webpack 之类的东西。
  • 我想要一些关于它的信息 ;)
猜你喜欢
  • 2018-02-26
  • 2018-10-24
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多