关于如何在服务器端与客户端执行javascript的困惑

Confusion on how to execute javascript server-side vs client-side

提问人:Bryan 提问时间:12/20/2022 更新时间:12/20/2022 访问量:1268

问:

我不确定我在这里问的问题是否正确。我提前为我的无知道歉,我只学了一年的全栈 JS 和 Web 应用程序架构,我正在尝试在细粒度上理解这一点。以前提出这个问题的尝试似乎冒犯了一些开发人员,所以也许这是一个愚蠢的问题。

我试图了解如何,或者如果可能的话,明确指定或分配特定的 javascript 文件或块,以便在服务器上处理/运行/执行,而不是在客户端/浏览器上。

在 app.js 文件中编写一些 javascript 并运行似乎仍会向浏览器公开该脚本,可在开发工具的“源”选项卡中查看。node app.js

PHP 由服务器解释,然后将静态 HTML 发送到客户端。这是否等同于使用 Javascript 应用程序框架进行服务器端渲染?或者用 HTML 服务器端内联编写 .php 文件(就像您在 Wordpress 中看到的那样)更等同于内联 javascript 客户端?还有一种不同的方法可以让JS在服务器端解释吗?

我一直在阅读有关GENERATE_SOURCEMAP的文章,但这似乎更像是用于隐藏客户端 JS 模块。

这个问题的其他可能措辞

  • 如何不向客户端公开服务器端 Javascript?
  • 如何在服务器上运行/执行 Javascript 而不是在浏览器中?

我不是在要求服务器端与客户端 JS 的定义,也不是在寻求服务器端应用程序框架的建议。

再一次,我想我把自己弄糊涂了,或者错过了一些非常基本的东西。也许唯一的答案是将您的私有 Web 应用程序与客户端应用程序分开并通过 API 进行访问。感谢您的帮助。

JavaScript node.js 服务器端 客户端

评论

2赞 Kevin B 12/20/2022
在node.js服务器中,唯一向浏览器公开的内容是node.js服务器本身通过 express.static 之类的东西直接向浏览器公开的内容,或者由为您的node.js应用程序提供服务的 Web 服务器公开的内容。 如果配置正确,节点服务器上的app.js不应向客户端公开。
2赞 David 12/20/2022
“显式指定或分配特定的 JavaScript 文件或块,以便在服务器上处理/运行/执行,而不是在客户端/浏览器上” - 您似乎以错误的方式思考这个问题。您不会在代码本身中逐块或逐行指定哪些部分是“用于服务器”的,哪些部分是“用于客户端”的。您在 NodeJS 应用程序中编写的任何内容都是服务器端代码。事实上,它也是用JavaScript编写的,这是无关紧要的。浏览器无法看到服务器在内部执行的操作。无论服务器向客户端发送什么,浏览器都会使用什么。
1赞 Pointy 12/20/2022
Node 程序不需要与提供网页有任何关系,特别是运行只会使“app.js”的 JavaScript 源代码可见,如果这是 Web 服务器的意图。node app.js
1赞 Kevin B 12/20/2022
快速服务器的默认设置是服务器本身不提供给客户端,如果客户端可以访问服务器端代码,那是因为您让 nginx 或 apache 在不应该的时候静态地为整个目录提供服务。
1赞 David 12/20/2022
@BryanZawlocki:我们无法真正告诉您您拥有的任何特定服务器或代码是否对客户端可见。您能否提供一个最小的可重现示例,即运行 Web 服务器(很可能是 Express,但不一定)并允许客户端查看您认为不应该查看的代码的 Node 应用程序?

答:

1赞 Mido elhawy 12/20/2022 #1

总结:服务器端的节点守护进程执行的 JavaScript 在客户端不可见,唯一可见的是 JS 的输出。

创建具有扩展名的文件时,需要执行此文件的可执行文件,以便将结果返回给客户端以呈现它。.php

例如:

  • 使用以下语法创建 PHP 文件:index.php
<?php
    echo '<script>console.log("HelloWorled")</script>'
?>

要运行此文件,您需要 PHP 守护程序(php 解释器)来运行该文件以获取此输出;输出将返回给客户端,在客户端浏览器上执行;<script>console.log("HelloWorled")</script>

在 PHP 中,此操作由 http 服务器(如 nginx)通过以下配置直接管理:

server{
   location ~ \.php$ {
     include snippets/fastcgi-php.conf;
     fastcgi_pass unix:/run/php/php<version>-fpm.sock;
   }
}

您将在文件中找到/etc/nginx/sites-available/default

这个规则只是告诉 nginx 让所有带有扩展名的文件都经过 php 代理执行,然后只将执行的结果返回给客户端。.php

你必须用 nodejs 想象完全相同的事情。

我用以下语法创建了一个文件:index.js

....
process.write( '<script>console.log("HelloWorled")</script>');
....

与您一起运行文件只会获得输出,您的服务器(例如 expressJS)将发送回客户端以在客户端运行它以获得与 php 代码相同的结果。node index.js<script>console.log("HelloWorled")</script>

笔记:

  • 你不需要暴露你的JS代码,你只需要一个代理来服务器它,就像PHP和NGINX一样(阅读更多关于expressJS和其他nodejs服务器框架的信息)。
  • 如果你需要公开客户端脚本,图像,样式,你需要在代理配置中指定它

评论

0赞 Bryan 12/20/2022
这是我迄今为止收到的最有用、最简洁的解释,谢谢!今晚和明天我将深入研究这个问题。node.js有内置的代理功能吗?还是像 Express、php/nginx 等效的框架工作是必须的?
0赞 Mido elhawy 12/20/2022
ExpressJS 是为 Node 创建 HTTP 服务器的最流行的框架;但如果你愿意,你可以直接使用 nodejs 原生模块http