【问题标题】:NodeJS - How to inject all dependencies in existing project?NodeJS - 如何在现有项目中注入所有依赖项?
【发布时间】:2015-10-03 01:24:40
【问题描述】:

我有一个现有的 web 项目,它的依赖项很少,例如

  • Materialize.css

  • lodash.js

  • script.js

  • style.css

    等等……

我认为 socketIO 不能像这样加载文件:

<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>

问题是我想让我的应用程序与 socket.io 进行通信,但是当我启动服务器文件 (index.js) 时,我可以看到我的页面,但由于没有 css 和脚本而完全损坏。

我的 index.js 看起来像这样:

var http = require('http');
var fs = require('fs');

var server = http.createServer(function(req, res) {
    fs.readFile('./index.html', 'utf-8', function(error, content) {
        res.writeHead(200, {"Content-Type": "text/html"});
        res.end(content);
    });
});


var io = require('socket.io').listen(server);


io.sockets.on('connection', function (socket) {
    console.log('Un client est connecté !');
    socket.emit('message', 'Vous êtes bien connecté !');
});


server.listen(8080);

那么您知道如何告诉服务器注入我现有网站的所有资源吗?

【问题讨论】:

  • 您可以包含一个巨大的 switch 案例或 if 语句来检测请求的资产并提供它,就像您对 index.html 所做的那样,但这不会很...枯燥或有趣或可重复使用。 Express 会使这更容易一些,但更好的选择是在您的应用程序前面使用 nginx 或 apache,以便您可以通过 apache/nginx 以及使用反向代理的节点服务器提供静态资产>,都在同一个端口下。
  • 你知道你已经创建了一个网络服务器,无论从网络服务器请求什么资源,你都会发送./index.html。您的 Web 服务器必须为您的站点所需的所有 Web 资源提供服务。当materialize.css 被请求时,您的网络服务器需要提供它,以及您的网站请求的所有其他文件,例如socket.io.js 文件。通常,不会像这样对静态资产文件进行硬编码。通常,您会设置一些通用基础架构来为静态资产提供服务。有很多方法可以做到这一点(Express.static、nginx、自定义代码等)。
  • 是的,我想我误解了这部分。这不仅仅是我想要包含的 index.html,而是它的所有依赖项!

标签: javascript css node.js html socket.io


【解决方案1】:

我认为您使用的示例代码只是为了提供一个简单的示例来说明向客户端提供的内容,而不是实际提供 HTML 页面或其他静态内容。

使用 Express,您可以这样做:

var app = require('../app');
var server = http.createServer(app);

然后在 app.js 中:

app.use(express.static(path.join(__dirname, 'public')));    //to render static content files to the browser from a predefined static resource directory

注意express.static 如何指向静态内容的位置。在这种情况下,它位于/public 文件夹中(可以是您选择的任何其他文件夹)。 index.html*.css 和你提到的所有资源都应该放在那里。

详细的例子可以在here找到。

最后,您在问题中粘贴的代码无需打开并提供http.createServer 中的index.html 文件即可工作;它不适用于静态内容。

【讨论】:

  • 是的,我现在也这么认为。您认为使用 socketIO 示例更容易吗?像这样的东西:app.get('/', function(req, res){ res.sendFile(__dirname + '/index.html'); });
  • 就个人而言,我不这么认为。我知道 websockets 协议如今风靡一时,但在某些特定的用例中它最适合。无状态 HTTP 仍然适用于大多数 Web 请求,包括提供静态页面。 socket.io 是有代价的,因为连接必须始终在服务器中打开(或大部分时间打开)。这样的服务器可以处理你所有的客户吗?那么值得付出代价吗?如果你的回答是肯定的,那就去吧。但是,请注意 socket.io 以 HTTP(长轮询)开始,然后如果可用,它可能会切换到 websockets(继续下面)...
  • 那么,如果已经有 HTTP,为什么不立即提供页面呢?希望这些信息对您有所帮助!
  • 罗伊,还有一件事。您将如何部署您的解决方案?例如,您会在nginx 后面运行多个 Node JS 实例吗?如果是这样,您可以直接从 nginx(或任何其他 Web 服务器)提供静态页面。这样您就不会占用 Node JS 的 CPU/io 时间。此外,nginx 可以充当 Node 实例的负载均衡器和防火墙。但是,如果您直接部署 Node,前面没有任何内容,则使用 E​​xpress 提供静态页面将起作用。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
  • 2018-12-27
相关资源
最近更新 更多