Meteor 项目中 /public/assets/ 的奇怪案例

The curious case of /public/assets/ in a Meteor project

在我的 Meteor 1.10.2 项目中,我在 /public/ 文件夹中创建了一个名为 assets 的文件夹。当构建 Meteor 应用程序时,我发现这个 assets 文件夹已被复制到这些位置,作为 web.browser... 文件夹的直接子文件夹:

/.meteor/local/build/programs/web.browser/assets/
/.meteor/local/build/programs/web.browser.legacy/assets

但是,如果我将文件夹重命名为 Assets(或者如果我给它起任何其他名称),则在构建应用程序时,我会在 app 文件夹的更深处找到它:

/.meteor/local/build/programs/web.browser/app/Assets/
/.meteor/local/build/programs/web.browser.legacy/app/Assets/

这背后的逻辑是什么?意图何在?使用 /public/assets/ 上的文件夹的最佳做法是什么?在用作 /public/ 文件夹中的文件夹名称时,是否有任何其他词得到特殊对待?

Meteor 所做的是多次构建您的项目。一次用于旧版 Web 浏览器,一次用于现代浏览器,还用于其他平台,例如 IOS 或 Android。如您所见,它在 .meteor/local 文件夹中执行所有这些操作。

Meteor 有/private 文件夹的概念,类似于/public,只不过Meteor 认为它们是assets。这可能解释了为什么您的文件夹会根据名称出现在不同的位置。

我个人不太担心 Meteor 如何处理文件,除非你想成为贡献者,在这种情况下欢迎你四处闲逛:)

FWIW,此行为特别是由于流星工具捆绑器:

https://github.com/meteor/meteor/blob/release/METEOR%401.10.2/tools/isobuild/bundler.js#L719-L725

  setTargetPathFromRelPath(relPath) {
    // XXX hack
    if (relPath.match(/^(packages|assets|dynamic)\//)) {
      this.targetPath = relPath;
    } else {
      this.targetPath = files.pathJoin('app', relPath);
    }

因此我们可以看到有 3 个特殊目录名称表现出这种特殊行为:

  • 资产
  • 动态

具有 public 资产的示例:

构建中捆绑的这些资产:

对于“包”,虽然我们可以理解 Meteor 是如何运送包的静态资产的(即当它们调用 api.addAssets() 时,我们也可以看到有可能发生冲突,在(尽管不太可能)我们使用像“public/packages/my-package-name”这样的路径名的情况。

至于“资产”,最初的名称是“静态”,但我认为它也public没有被记录下来。

对于“动态”,我还不知道它的确切用途是什么,但我们可以看到它的内容以“javascript”类型(至少是 SVG 文件)提供,而第一个2 将它们作为“text/plain”。