为啥 Nodejs 中 js 引用其他文件的函数相对来说要麻烦一些?

发布于 1周前 作者 yibo5220 来自 nodejs/Nestjs

为啥 Nodejs 中 js 引用其他文件的函数相对来说要麻烦一些?

如果是 java 直接 ide import 一下就好了。 可 js 如果不想让一个 js 文件又臭又长想分成几个文件的话就要写一堆麻烦的东西…

33 回复

一堆麻烦的东西是指?


不知道你在说啥??? JS 以前没有模块系统,从 ES6 以后,JS 原生支持 Module, 没看出来那里麻烦。

用 java 类比的话,简而言之,javascript 没有 class

是的,js 就是这么个弱鸡语言,你敢相信一个连模块系统都没有的语言竟然能活下来?只能说山中无老虎猴子称大王了,web 前端之前各大公司都不重视,只有 js 这么一个语言,再垃圾也只能用他了。

谁说 js 没有模块系统?

不会用 === 没有

node 现在既支持 cjs 又支持 esm ,为什么你需要写“一堆麻烦的东西”?打包器吗?

js 现在的问题是模块系统太多了…

那只能说明 ide 不智能,找个好的 ide

不是 js 没有 class 而是 js 程序员不懂面向对象

#9 不是 js 程序员不懂面向对象,是不需要面向对象,不像 java 只能面向对象

ts 可以写成 java 那样。 AOP , 依赖注入。



贴一段 vs code 的源码。


export class RequestService extends Disposable implements IRequestService {

constructor(
configurationService: IConfigurationService,
private readonly environmentService: INativeEnvironmentService,
private readonly logService: ILogService
) {
super();
}

}

#4 普信 C# 程序员

我能搜索到的最简单的「 nodejs 引入其他文件函数」的方式,点开一看: 一堆麻烦的东西…

不就是一个 export 一个 import 吗?你是不是用百度搜的五年前的 csdn ?



推荐直接上手 ts , 写 java 可以无缝转移。

https://nestjs.com/. 写起来和 spring 差不多

你说错了哦,java 没有模块系统,node.js 有好几套模块系统。
java 的包只能算命名空间,都在全局。import 只是方便你不写全名而已

JS 怎么使用 import 引入模块 ❌
JS 引入文件又臭又长,不让 Java 方便 ✔️

如果你用 TypeScript 和支持 ts server 的编辑器 (例如 VS Code),那么你在引用一个成员的时候会自动帮你 import

好像很多朋友都没有正面回答你的问题,我来尝试说下我的理解。

想象自己是一个小学生,要召集一群同学出去玩,要么可以自己去找一些认识的同学,然后再借助他们找到更多的同学;要么可以联系班主任,让他来协调所有同学出去玩。前者的缺点是你需要记得同学的联系方式并且主动联系他们,后者的缺点是需要依赖班主任这个额外角色。

对应到实际语言的模块系统里,上面前者的方式就像一些语言在代码里主动从文件引入依赖模块的做法,比如 JS 或者 Rust ,只要指定一个入口点,编译器就能一步步从入口点这个模块找到所有依赖的模块,构成一棵树,所以你需要「一些麻烦的东西」来自己联系小伙伴。(虽然 Rust 有 Cargo ,但 Cargo 并没有做这些事情,依然是 Rust 编译器完成的)

另一些语言,引入了独立的构建管理器来解决这个问题,比如 Java 和 Swift ,在这些语言里你就不需要手动去 import 某个具体文件,因为构建系统(班主任)已经帮你追踪好了每个模块的信息,再帮你完成这个事情。缺点就是这个构建系统对新手来讲容易像一个黑箱,没有 JS 一样手动 import 具体文件一样直观。

还有更原始的,那就是 C/C++,但它们也不过是直接把独立文件的构建过程暴露出来而已。你要用 CMake 等作为构建系统那也没问题。

大概理解 楼主 的意思,本人学习 swift 的时候,发现 swift 的函数、类所在的文件写在项目下任意地方都可以,只要名称不重复就行,从某种意义上来说引入非常的傻瓜化;

但是 JS 能活到现在肯定不是偶然的:

一是 API 相当稳定,从 es5-es6 ,API 是完全兼容的,以前怎么 用现在还是怎么用,所以菜鸟在网上搜索到的 例子 可以无脑的跑起来,像隔壁的 python 的 2-3 那叫一个坑。

其次,手动引入操作从某种程度上来说,也是一种克制化设计,并不需要完全自动化,但也能正确的运行起来,够用就好。




连谷歌的各种作妖操作,想换掉这门垃圾语言,你看看越来越多人使用。当年 flutter 如果想办法用 js 开发,流行程度肯定大不一样。

js 你分几个文件,根本不需要引入, 只要再你使用的页面里面( <script src=“js 文件”></script>)把你这几个文件都加上就行了。 根本不需要 import

如果没有 html 呢?

你对 js 的印象还停留在几年前

js 还分几年前,几年后的? 能跑起来不就可以了。

写个 main 函数导出下就可以了。




test1.js

javascript<br>function ClassA()<br>{<br> this.Value<br> .....<br>}<br>


test2.js

javascript<br>function ClassB()<br>{<br> this.Value<br> .....<br>}<br>

页面调试直接用 js 文件

javascript<br>&lt;script src="test1.js"&gt;&lt;/script&gt;<br>&lt;script src="test2.js"&gt;&lt;/script&gt;<br>

vue, nodejs 等需要导出的加一个导出 js

export.js

javascript<br>//把给外界调用的方法暴露出来<br>export default <br>{<br> ClassB: ClassB,<br> ClassA: ClassA<br> ...<br>}<br>

用命令行合并文件就完事了。
copy test1.js+test2.js+export.js test.node.js /b


一般直接用浏览器调试,方便,不需要编译, 一个记事本+浏览器就可以开发了。前端开发要搞怎么复杂干什么呢,最后还不是编译成 es5 的 js 。

为什么是 C#,咬到你了?

我感觉你的问题应该是命名空间的范畴,早期 js 要敲一堆代码,现在依靠 namespace ,大大简化了导入要敲的代码了。
java 是默认引用了一堆全局的 namespace ,而 js 这边要达到同样的编码体验就是要用 ts 了。其实现代 PHP 也是依靠命名空间解决了此类问题的,使得导入变的规范多了。大家都在借鉴 java 的成功之处,哈哈。

js 的运行环境比较多,浏览器的 js ,Node.js 压根就不是一个东西。谁知道你要的是什么 js ,更不要说各类 js 的超集,打包工具,不同的模块规范。
不如说,为什么编程语言引用其他文件的函数相对来说要麻烦一些。

在Node.js中,JS引用其他文件的函数看似相对麻烦,但实际上这是Node.js模块化设计的一部分,旨在提高代码的可维护性和复用性。下面解释一下这一过程及如何使用:

首先,在Node.js中引用其他文件的函数需要使用require()方法。这个方法用于加载模块,可以是其他JavaScript文件、JSON文件或Node.js内置的模块。

例如,假设我们有一个名为utils.js的文件,其中定义了一个函数sayHello

// utils.js
function sayHello() {
  console.log("Hello from utils.js");
}

module.exports = { sayHello };

然后,在另一个文件中(如app.js),我们可以使用require()方法引入utils.js文件,并调用其中的sayHello函数:

// app.js
const utils = require('./utils');
utils.sayHello();

通过这种方式,我们可以将代码拆分成多个模块,每个模块负责不同的功能,从而提高代码的可读性和可维护性。

总的来说,Node.js中引用其他文件的函数并不是真的“麻烦”,而是设计为一种模块化的开发方式,这是现代软件开发中的一种最佳实践。

回到顶部