我对如何将驻留在/ imports / server下的[发布]函数和[流星方法]导入到Blaze客户端(在/ imports / client / ui或什至在app-name / client下)感到困惑。

经典方法是只使用publish或meteor方法,而所有内容都由客户端使用而无需导入。但是,如果所有内容都位于/ imports目录(包括Blaze模板)下,那么它将如何工作?有真实的例子吗?

插图:

//导入/服务器/发布/test.js

Meteor.publish('publish.test', function() {
  if (this.userId) return TestCollection.find({});
  return self.ready();
});


// import / client / ui / test.js

import { Template } from "meteor/templating";
import { ReactiveDict } from "meteor/reactive-dict";
import { Mongo } from 'meteor/mongo';
import TestCollection from '../../imports/collections/test.js';

import "./test.html";

Template.Test.onCreated(function() {
  this.state = new ReactiveDict();

  this.autorun(() => {
    const subscription = this.subscribe('publish.test');
     ...
    }
  });
});


在开发的新导入方式中,服务器端唯一的东西如何进入客户端?

UPDATE1:

回应Answer1,这样的工作可行吗?另外,客户看起来还好吗?

// app-name / imports / server / trades-pubs.js

  // This code only runs on the server
  Meteor.publish('trades', function tradesPublication() {
    return Trades.find({},{sort: {timestamp: -1}, limit: 1000});
  });


// app-name / imports / server / trades-methods.js

Meteor.methods({
  // Only on server
  'trades.importFromFiles'() {
      fs = require('fs');
      const path = "/home/daemmon/trades_data/";
      var files = fs.readdirSync(path);
      ...
  }
});


// app-name / server / main.js

import '../imports/server/trades-methods.js';
import '../imports/server/trades-pubs.js';


这是向客户端提供发布方法而客户端可以使用服务器端流星方法所需的全部吗?

// import / client / ui / test.js

import { Template } from "meteor/templating";
import { ReactiveDict } from "meteor/reactive-dict";
import { Mongo } from 'meteor/mongo';
import TestCollection from '../../imports/collections/test.js';

import "./test.html";

Template.Test.onCreated(function() {
  this.state = new ReactiveDict();

  this.autorun(() => {
    const subscription = this.subscribe('trades');
     ...
    }
  });
});


UPDATE2:


  您可能还需要考虑在您的客户端代码中的某个位置(例如,在类似app-name / client / main.js的文件中)导入app-name / imports / server / trades-methods.js


我以为我们无法在客户端上导入服务器代码?例如,如果要导入trades-methods.js,则必须将其移动到app-name / imports / api或/ imports / server之外的其他位置。

UPDATE3:

阅读Meteor Guide时,我对本段感到困惑:




  为了充分利用模块系统并确保我们的代码仅在我们要求时运行,我们建议您将所有应用程序代码放置在imports /目录中。这意味着,如果使用导入从另一个文件中引用了该文件,则Meteor构建系统将仅捆绑并包含该文件(也称为“延迟评估或加载”)。
  
  流星将使用默认的文件加载顺序规则(也称为“紧急评估或加载”)在应用程序中的任何名为imports /的目录之外加载所有文件。建议您完全创建两个急切加载的文件,client / main.js和server / main.js,以便为客户端和服务器定义显式入口点。 Meteor确保任何名为server /的目录中的任何文件仅在服务器上可用,并且同样适用于任何名为client /的目录中的文件。这也排除了尝试从名为client /的任何目录中导入要在服务器上使用的文件的方法,即使该文件嵌套在imports /目录中,反之亦然,也无法从server /目录中导入客户端文件。
  
  这些main.js文件本身不会做任何事情,但是它们应该导入一些启动模块,这些启动模块将在应用加载后立即分别在客户端和服务器上运行。这些模块应该对您在应用程序中使用的软件包进行必要的配置,然后导入应用程序的其余代码。




这是否不是意味着例如,如果[/ app-name / imports / server]目录中有一个文件,则无法在此处[/app-name/client/main.js]的客户端中导入此文件?



例如,我不能执行以下操作:

导入/ server目录中的模块:
/app-name/imports/server/server-test.js

导入/ client目录中的模块:
/app-name/imports/client/client-test.js



流星客户端的入口点:
/app-name/client/main.js

// => Would NOT work?
import { ServerTest } from "../../imports/server/server-test.js";

// => Would work?
import { ClientTest } from "../../imports/client/client-test.js";


UPDATE4:

您在Update2上的措辞如下:


  在/ imports文件夹中,没有特殊的文件夹名称-因此您
  可以使用客户端代码从/ imports / server导入文件。


...这是《流星指南》这一部分的不正确according to the author

最佳答案

首先,由于发布和方法仅通过其字符串名称进行引用,因此不需要将它们导入到预订它们或调用函数的代码中。在执行Meteor.subscribe('publication')时,Meteor将尝试在服务器中找到名为publication的发布并进行订阅。同样适用于流星方法。

但是,使用/imports文件夹时,您的发布和方法需要在服务器代码中的某个地方import,以便Meteor完全加载它们。最佳做法是将文件放置在imports文件夹中的某个位置,例如/imports/startup/server/index.js(如Meteor指南所建议),在这里您只需导入声明发布和方法的所有文件,然后导入此单个文件在imports文件夹之外的某些文件中。有关更多信息,请参见the Meteor Guide及其example app

还要注意,对于Meteor方法,您可能还希望将它们也包含在客户端代码中的某个位置,以便客户端可以在服务器调用返回之前为乐观UI运行它们的模拟。为此,您可以执行与上述相同的操作,但是要使用包含在客户端代码中的/imports/startup/client/index.js这样的文件。我还建议签出mdg:validated-method软件包,它使使用方法更整洁。

有关问题中更新的更新:

是的,这似乎可行,我想您明白了:)

就像我说的那样,作为次要细节,您可能还想考虑在客户端代码中的某个位置(例如,在app-name/imports/server/trades-methods.js之类的文件中)导入app-name/client/main.js。这将使客户端能够运行该方法的模拟并立即更新UI,以获得更好的用户体验。但是,如果您不想向客户端公开一些超级秘密服务器代码,请不要执行此操作。

问题中的更新2

/imports文件夹中,没有特殊的文件夹名称-因此您可以在客户端代码中从/imports/server导入文件。但是,我建议将仅用于服务器(如出版物)的代码放置在名为server的文件夹中,而不要将打算从两侧使用的代码放置到名为serverclient的文件夹中。因此,您可能还是要将trades-methods.js文件移到/imports/server文件夹之外。但这只是为了清楚起见,Meteor不在乎/server中的文件夹名称!

我真的非常建议您阅读Meteor指南,尤其是chapter on application structure并检查相关example app的结构。从长远来看,您将节省大量时间!

08-07 19:06