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");
}
});
答案 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/
很容易当他们写这篇文章时,他们基本上都有你的需求。
(我没有加入这个项目)