如何使用Node.js来构build静态和dynamic内容混合的页面?

我的5页网站上的所有页面都应该使用Node.js服务器输出。

大部分页面内容是静态的。 在每个页面的底部,都有一些dynamic内容。

我的node.js代码目前看起来像:

var http = require('http'); http.createServer(function (request, response) { console.log('request starting...'); response.writeHead(200, { 'Content-Type': 'text/html' }); var html = '<!DOCTYPE html><html><head><title>My Title</title></head><body>'; html += 'Some more static content'; html += 'Some more static content'; html += 'Some more static content'; html += 'Some dynamic content'; html += '</body></html>'; response.end(html, 'utf-8'); }).listen(38316); 

我确信这个例子有很多错误。 请赐教! 例如:

  • 如何将静态内容添加到页面,而不将其作为variables值存储在string中,并且+ =多次?
  • 在Node.js中build立一个小型站点的最佳实践方式是什么?所有页面都是静态和dynamic内容的混合体?

就个人而言,我会使用具有更高层次结构的服务器。 例如,看看expressjs框架 – http://expressjs.com/

你将从这个包中感兴趣的构造是:

例如玉:

 !!! 5 html(lang="en") head title= pageTitle script(type='text/javascript') if (foo) { bar() } body h1 Jade - node template engine #container - if (youAreUsingJade) p You are amazing - else p Get on it! 

变为:

 <!DOCTYPE html> <html lang="en"> <head> <title>Jade</title> <script type="text/javascript"> if (foo) { bar() } </script> </head> <body> <h1>Jade - node template engine</h1> <div id="container"> <p>You are amazing</p> </div> </body> </html> 

如果你喜欢不那么激烈的东西,我会说看看胡子或其他引擎看起来更像是普通酱HTML。

另外,你可以只使用jsDOM 。 这意味着您可以在服务器上操作DOM对象来添加dynamic内容,然后只需将DOM作为HTML文件/string

现在的答案并不那么简单。

如果您不需要Google编入索引,请考虑使用socket.io和客户端模板(如jQuery Templates制作单页应用程序。 甚至还有新兴的node.js框架用于这种types的体系结构,例如socketstream

如果您需要Google的索引,您是否需要将您的dynamic内容编入索引? 如果是,请考虑使用express和服务器端模板,如ejsjademustache 。 另一种(不鼓励)的方法可能是从服务器上的JSON生成XML,并使用XSLT前端。

如果只需要将静态内容编入索引,请考虑在服务器上使用express ,但不要在服务器上生成任何dynamicHTML。 相反,使用AJAX或socket.io将您的dynamic内容以JSON格式发送到客户端,并使用客户端模板(如jQuery Templates呈现它。

不要考虑服务器端的DOM:DOM不能扩展到复杂的布局,你会沉浸在select器和DOM调用的海洋中。 即使客户端开发人员也理解并实现了客户端模板。 一个新的有前途的方法是weld库。 它提供了最好的两个世界,但它还没有成熟用于生产(例如简单的东西,如条件渲染不支持)。

一个好方法是使用模板引擎。 您可以将模板存储为单独的文件,并且模板引擎可以使内容dynamic化。 就我个人而言,我使用的是为networking编写的yajet(http://www.yajet.net/),但在节点上工作正常,在npm上有很多节点引擎。;

我发现的最好的事情之一是使用NodeJS,Express和Moustache …

您可以像平时一样使用Mustache语法来创build您的HTML页面,作为variables的占位符{{name}}。

当用户点击你的网站时,表示将snugexpression到正确的模板… NodeJS获取文件… NodeJS获取数据库中的数据集…通过服务器上的Mustache运行…将完成的页面发送到客户端…

这是我在博客上写的缩小版本。 这很简单,但这个想法是非常合理的。 我用它来快速在我的网站上部署页面。

http://devcrapshoot.com/javascript/nodejs-expressjs-and-mustachejs-template-engine

我走了这条路,因为我不想学习所有额外的语法来编写我已经知道的语言(html)。 它更有意义,并遵循更多的真正的MVC模式。

我一直在我的应用程序托pipe在内联网做同样的事情。 我首先使用本地CDN类服务器提供静态文件,而不是调用Nodejs来获取dynamic内容。

首先仅将静态HTML文件从服务器传送到客户端。 然后使用AJAX / server.io来提供dynamic内容。 国际海事组织翡翠是非常丑陋的编写HTML代码,它更好地使用模板引擎。

我做了一些Google,发现了这个人的一些代码,如果你正在做PoC /学习,那么这个代码是很好的。

 var server = require('./server'); var controller = require("./controller"); var urlResponseHandlers = require("./urlResponseHandlers"); var handle = {}; handle["/"] = urlResponseHandlers.fetch; handle["/fetch"] = urlResponseHandlers.fetch; handle["/save"] = urlResponseHandlers.save; server.start(controller.dispatch, handle); 

以下是如何显示处理URL的逻辑 –

 var staticHandler = require('./staticHandler'); function dispatch(handler, pathname, req, res) { console.log("About to dispatch a request for " + pathname); var content = "Hey " + pathname; if (typeof handler[pathname] === 'function') { content += handler[pathname](req); res.writeHead(200, { 'Content-Type': 'text/html' }); res.write(content); res.end(); } else { console.log("No request handler found for " + pathname); staticHandler.handleStatic(pathname, res); } 

}

这里是如何处理静态文件 –

 function handleStatic(pageUrl, response) { var filename = path.join(process.cwd(), pageUrl); path.exists(filename, function (exists) { if (!exists) { console.log("not exists: " + filename); response.writeHead(404, { 'Content-Type': 'text/html' }); response.write('404 Not Found\n'); response.end(); return; } //Do not send Content type, browser will pick it up. response.writeHead(200); var fileStream = fs.createReadStream(filename); fileStream.on('end', function () { response.end(); }); fileStream.pipe(response); return; }); } exports.handleStatic = handleStatic; 

我喜欢这个主意。 从这个链接复制的所有代码! 。

一个解决scheme已经发现,没有使用任何其他模块,或者其他脚本是使调用脚本成为一个模块,并包括它与函数require()
有了这个解决scheme,我可以使用任何我想要的JavaScript
我会做的是做一个Ajax调用一个nodejs脚本(www.example.com/path/script.js)
script.js将需要像exports.functionName=function(){...}
之后,包括它在你的web服务器functionrequire(pathToTheScript).functionName(res,req)
您还需要通过执行res.end()来结束functionName(res,req)中的响应。