如何在Node.js应用程序中提供CSS服务

3

我一直在研究node.js,但似乎无法正确地提供CSS。以前,我将它嵌入到HTML的头部标签中,但现在我正在尝试学习如何将其作为单独的文件提供。

到目前为止,这就是我所做的。在加载服务器下的HTML之前,我尝试仅将其写入:

//This is all my main module

var http = require('http');
var router = require('./router.js');

var server = http.createServer(function (request, response) {

response.writeHead(200,{"Content-type" : "text/css"});
var fileContents = fs.readFileSync('./views/styles.css', {encoding: "utf8"}, function(err, data) {
 if (!err) {
   response.write(data);
} else {
  console.log(err);
}
});

  router.home(request, response);
  router.user(request, response);

});

server.listen(3000);

我在路由模块中调用的home函数如下所示。它也完美地发挥作用:
function home(request, response) {
  //if url == "/" && GET

if (request.url === "/"){
if(request.method.toLowerCase() === "get") {
  response.writeHead(200, commonHeaders);
  renderer.view("header", {}, response);
  renderer.view("search", {}, response);
  renderer.view("footer", {}, response);
  response.end();

} else {
    //if url == "/" && POST
//redirect to /:username

  request.on("data", function(postBody) {
    var query = querystring.parse(postBody.toString());
    response.writeHead(303, {"Location":"/" + query.username});
    response.end();
  });
  }
 }
}

我所有的HTML都可以完美加载。但是,如果我在Chrome中使用开发工具,它会显示我已经创建了一个带有styles.css文件的单独文件夹,但是它是空的。为什么它会创建我的文件,但我的CSS没有被写入其中呢?

我做错了什么吗?我的HTML头部也链接了样式表。如何在node.js应用程序中提供CSS服务?我不知道为什么这行不通。


1
你为什么要通过node进程来提供CSS,而不是直接使用nginx(例如)处理呢?由于它是静态资源,因此没有必要让node进程负担它。 - 1sloc
1
@m-a-r-c-e-l-I-n-o的下面的回答对于你正在做的事情是正确的。然而,我强烈建议您引入一个Web应用程序框架,例如Express(在Node市场上最受欢迎),而不是尝试通过本地模块处理http请求/响应周期。静态文件服务可能最好通过NGINX或类似工具处理,但即使您无法访问NGINX或由于某种原因想要去'纯'节点,使用Express也会节省大量时间和头痛。 - Paul
1
@Paul 的观点很有道理,如果你采取了 Robert 提出的方法,但仍然无法按预期工作,那么你可能仍需要访问服务器以确保文件使用正确的 MIME 类型进行服务,否则你将再次在 Chrome 开发工具中看到一个空的 styles.css 文件。 - m-a-r-c-e-l-i-n-o
我主要只是想学习它的工作原理。目前看起来似乎不是一个好主意,而且到目前为止也让我头疼不已。这不是为了一个项目或其他什么东西 - 我只是想学习如何提供CSS。不过我计划使用Express并学习如何通过它处理请求和响应。 - Robert Stefanic
1个回答

7
我所有的HTML都可以很好地加载。如果我在Chrome中使用开发工具,它会显示我已经创建了一个带有styles.css文件的单独文件夹,但是它是空的。为什么它会创建我的文件,但我的CSS没有被写入其中呢?
很可能是因为fs.readFileSync是同步的,但错误地提供了回调函数。请尝试使用以下代码:
response.writeHead(200, {'Content-type' : 'text/css'});
var fileContents = fs.readFileSync('./views/styles.css', {encoding: 'utf8'});
response.write(fileContents);
response.end();

我这样做错了吗?我在HTML头部链接了一个样式表。如何在node.js应用程序中提供CSS呢?
“错”是一个强烈的词,但是是的,手动提供静态文件不是最好的方法,这样很可能无法扩展。你应该配置Web服务器来提供所有静态文件,并且只处理Node.js中的动态内容。我不会涉及具体细节,但是在Stack Overflow上提出另一个问题,指定您正在运行的服务器以及如何使用Node.js正确配置它。或者,您可以查找一些有关如何使用NGINX服务器运行Node.js的教程 - 这应该可以让您走上更可持续的道路。
希望这可以帮助你!

感谢您的快速回复。我尝试了那个方法,但现在当我使用它时,它只是用我的CSS的纯文本替换了我的页面。我想这比我想象的要难得多。我正在学习node,并且只是想学习如何做到这一点以了解整个过程。这不是为了一个真正的项目或任何事情。我肯定会去看看NGINX,但这仍然让我感到沮丧,因为在我的脑海中,它似乎应该可以工作。 - Robert Stefanic
1
没问题 :) 为什么不试着为你的CSS创建一个路由(例如router.css(request, response)),并将我在帖子中建议的代码放入其中,并将其包装在一个if语句中,只针对CSS文件 if (request.url === "/styles.css")。我认为你没有意识到的部分是CSS不会随页面一起发送。你的HTML页面独立存在,一旦它们到达客户端,客户端将从服务器请求该文件(假设它们有html css标签 - 即<link rel="stylesheet" href="styles.css">),这有道理吗? - m-a-r-c-e-l-i-n-o
1
成功了!我明白你的意思。我删除了之前尝试“提供”CSS的方法,然后发现在我的开发工具下,styles.css仍然存在,因为我的HTML中的链接标签仍然引用了那个文件,即使它不存在。所以我设置了CSS先被请求,然后我的HTML可以被样式化,因为它找到了链接中引用的样式表。你最后的建议真的帮了我很多。我采纳了你的建议,一切都完美无缺。我现在明白了这是如何工作的。非常感谢你,你给了我巨大的帮助。 - Robert Stefanic
没问题,Robert!很高兴听到你解决了问题。如果你觉得这个回答对你的问题有所帮助,请考虑将其标记为“正确答案”(通过点击此帖子左上角的灰色复选标记)。祝你好运 :) - m-a-r-c-e-l-i-n-o
还有一件事要补充。在我的HTML CSS标签中,我的href以前是_href='./views/styles.css'_,但正如你所说,CSS不会随着页面一起发送。因此,我不得不让HTML CSS标签引用客户端文件,而不是服务器文件,所以根据你的建议,我将其改为_href='styles.css'_。再次感谢您的帮助。我已经苦苦挣扎了一段时间哈。 - Robert Stefanic
准确地说,哈哈。没问题! - m-a-r-c-e-l-i-n-o

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接