我可以热部署Meteor客户端HTML文件吗?

时间:2014-08-29 18:03:54

标签: node.js meteor

Meteor非常惊人,您可以在本地开发时手动更新HTML文件,这些更改会在您保存文件时立即生效。我想采用相同的功能并将其带到我们部署的环境中。原因是我们希望允许我们的客户对UI进行更改,而无需重新部署应用程序,甚至不知道它是Meteor应用程序。他们可能会在列表视图中添加新字段,为表单添加新字段,更改标签等。

到目前为止,我已经创建了一种方法,让他们使用DSL调用REST服务来描述这些更改并将其保存在Mongo中。然后我们有一个动态创建HTML模板的引擎来实现它。一切都很好。

接下来,我尝试根据我对Meteor数据库的订阅进行Meteor HTML文件的热部署,Meteor数据库存储可能会根据需要更改的内容。是否可以动态更新Meteor客户端文件系统,以便实现热部署?

在服务器发布方法上执行以下操作会导致ENOENT: no such directory错误:

var result = decodeHTML(cheerio.html());
console.log(result);

// Output to file
fs.writeFile('../client/app/client/templates/request-base-template.html', result, function (err) {
    if (err) {
        console.log("error: " + err);
    }
    else {
        console.log("File saved successfully");
    }
});

2 个答案:

答案 0 :(得分:9)

将文件保存到磁盘以期望"热门代码推送重新加载"绝对是一个错误的方式来到这里。

Meteor在开发模式下提供文件监视功能,它将重新编译整个应用程序并在浏览器中刷新页面,但这是为了方便开发人员而不是应用程序的运行时使用。实际上,在生产中部署文件时甚至不会发送文件。

但是这是实现用例的一种方法。这需要更深入地了解Meteor在幕后为您做的事情。

首先,您需要意识到Meteor在构建时将您的模板(Spacebars模板)编译为自己的JS DSL(HTMLJS)。每个基于结构的模板都会发生类似的事情,无论是在运行时还是在构建时编译它们。 Meteor在构建时间内完成它以提高效率。您可以在Meteor Manual, Blaze chapter;

中详细了解相关信息

这里的高级点是:如果你有一个模板

<template name="bla">
  Hello {{name}}!
</template>

..它会编译成这样的东西:

Template.__define__("bla", (function() {
  var view = this;
  return [ "Hello ", Blaze.View(function() {
    return Spacebars.mustache(view.lookup("name"));
  }), "!" ];
}));

知道了吗?大。

现在,您需要从用户那里获得这种模板并将它们编译到这个基于JS的DSL中。您可以使用内置的spacebars-compiler包。

// on the server!
Meteor.startup(function () {
  // imagine your template is actually coming from database or where you store your user-generated content
  var template = "<p>Hello {{name}}!</p>";
  console.log(SpacebarsCompiler.compile(template));
});

如果您将spacebars-compiler添加到您的应用并运行它,它将打印一个很好的编译模板。这是一个现场演示:http://meteorpad.com/pad/4tHHAvjpcBQwLuN4K

完美,现在以任何您想要的形式将此编译模板发送到客户端(通过数据库,通过Meteor方法或REST API,它并不重要,只需将字符串发送到客户端)。

一旦它存在,您可以将它附加到任何您想要的地方!

更简单的方法之一是在JS代码中注册模板:

// on the client! pretend you got the compiledTemplate string from the server
var compiledTemplate = '(function() { var view = this; return HTML.P("Hello ", Blaze.View(function() {return Spacebars.mustache(view.lookup("name")); }), "!");})';
Template.__define__("myAwesomeTemplate", eval(compiledTemplate));

然后使用UI.dynamic之类的东西在页面上呈现它。您可以在此处查看实时演示:http://meteorpad.com/pad/LQJuoooBQjSdJenfW

答案 1 :(得分:1)

您是否同意您正在编写定制的cms系统?如果是这样,流星中已经有一些cms系统。

我发现扩展早期版本的http://azimuthc.ms/

很容易

当他们写这篇文章时,他们基本上都有你的需求。

(我没有加入这个项目)