V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pdog18
V2EX  ›  Node.js

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

  •  
  •   pdog18 · 325 天前 · 6697 次点击
    这是一个创建于 325 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    32 条回复    2022-11-18 16:07:45 +08:00
    shintendo
        1
    shintendo  
       325 天前   ❤️ 2
    一堆麻烦的东西是指?
    thinkershare
        2
    thinkershare  
       325 天前   ❤️ 1
    不知道你在说啥??? JS 以前没有模块系统,从 ES6 以后,JS 原生支持 Module, 没看出来那里麻烦。
    ragnaroks
        3
    ragnaroks  
       325 天前   ❤️ 1
    用 java 类比的话,简而言之,javascript 没有 class
    wdwwtzy
        4
    wdwwtzy  
       325 天前
    是的,js 就是这么个弱鸡语言,你敢相信一个连模块系统都没有的语言竟然能活下来?只能说山中无老虎猴子称大王了,web 前端之前各大公司都不重视,只有 js 这么一个语言,再垃圾也只能用他了。
    xintianyou
        5
    xintianyou  
       325 天前
    @wdwwtzy 谁说 js 没有模块系统?
    FrankHB
        6
    FrankHB  
       325 天前
    @wdwwtzy C:?
    arnosolo
        7
    arnosolo  
       325 天前   ❤️ 1
    不会用 === 没有
    Trim21
        8
    Trim21  
       325 天前 via Android
    node 现在既支持 cjs 又支持 esm ,为什么你需要写“一堆麻烦的东西”?打包器吗?

    @wdwwtzy js 现在的问题是模块系统太多了…
    lsry
        9
    lsry  
       325 天前
    那只能说明 ide 不智能,找个好的 ide
    nomagick
        10
    nomagick  
       325 天前
    不是 js 没有 class 而是 js 程序员不懂面向对象
    toesbieya
        11
    toesbieya  
       325 天前
    @nomagick #9 不是 js 程序员不懂面向对象,是不需要面向对象,不像 java 只能面向对象
    hamsterbase
        12
    hamsterbase  
       325 天前
    ts 可以写成 java 那样。 AOP , 依赖注入。



    贴一段 vs code 的源码。


    export class RequestService extends Disposable implements IRequestService {

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

    }
    statumer
        13
    statumer  
       325 天前
    @wdwwtzy #4 普信 C# 程序员
    pdog18
        14
    pdog18  
    OP
       325 天前
    @shintendo 我能搜索到的最简单的「 nodejs 引入其他文件函数」的方式,点开一看: 一堆麻烦的东西....
    pdog18
        15
    pdog18  
    OP
       325 天前
    @hamsterbase 我的天呐
    DrakeXiang
        16
    DrakeXiang  
       325 天前   ❤️ 4
    不就是一个 export 一个 import 吗?你是不是用百度搜的五年前的 csdn ?
    hamsterbase
        17
    hamsterbase  
       325 天前   ❤️ 1
    @pdog18

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

    https://nestjs.com/. 写起来和 spring 差不多
    magicdawn
        18
    magicdawn  
       325 天前 via Android   ❤️ 1
    你说错了哦,java 没有模块系统,node.js 有好几套模块系统。
    java 的包只能算命名空间,都在全局。import 只是方便你不写全名而已
    molvqingtai
        19
    molvqingtai  
       325 天前 via Android   ❤️ 1
    JS 怎么使用 import 引入模块 ❌
    JS 引入文件又臭又长,不让 Java 方便 ✔️
    djyde
        20
    djyde  
       325 天前   ❤️ 1
    如果你用 TypeScript 和支持 ts server 的编辑器 (例如 VS Code),那么你在引用一个成员的时候会自动帮你 import
    pocarisweat
        21
    pocarisweat  
       325 天前   ❤️ 2
    好像很多朋友都没有正面回答你的问题,我来尝试说下我的理解。

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

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

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

    还有更原始的,那就是 C/C++,但它们也不过是直接把独立文件的构建过程暴露出来而已。你要用 CMake 等作为构建系统那也没问题。
    humbass
        22
    humbass  
       325 天前
    大概理解 楼主 的意思,本人学习 swift 的时候,发现 swift 的函数、类所在的文件写在项目下任意地方都可以,只要名称不重复就行,从某种意义上来说引入非常的傻瓜化;

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

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

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




    连谷歌的各种作妖操作,想换掉这门垃圾语言,你看看越来越多人使用。当年 flutter 如果想办法用 js 开发,流行程度肯定大不一样。
    jones2000
        23
    jones2000  
       325 天前
    js 你分几个文件,根本不需要引入, 只要再你使用的页面里面( <script src="js 文件"></script>)把你这几个文件都加上就行了。 根本不需要 import
    pdog18
        24
    pdog18  
    OP
       325 天前
    @jones2000 如果没有 html 呢?
    xintianyou
        25
    xintianyou  
       325 天前
    @jones2000 你对 js 的印象还停留在几年前
    jones2000
        26
    jones2000  
       325 天前
    @xintianyou js 还分几年前,几年后的? 能跑起来不就可以了。
    jones2000
        27
    jones2000  
       325 天前
    @pdog18 写个 main 函数导出下就可以了。
    jones2000
        28
    jones2000  
       325 天前
    @pdog18
    @xintianyou

    test1.js

    ```javascript
    function ClassA()
    {
    this.Value
    .....
    }
    ```


    test2.js

    ```javascript
    function ClassB()
    {
    this.Value
    .....
    }
    ```

    页面调试直接用 js 文件

    ```javascript
    <script src="test1.js"></script>
    <script src="test2.js"></script>
    ```

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

    export.js

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

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


    一般直接用浏览器调试,方便,不需要编译, 一个记事本+浏览器就可以开发了。前端开发要搞怎么复杂干什么呢,最后还不是编译成 es5 的 js 。
    Manweill
        29
    Manweill  
       325 天前
    @statumer 为什么是 C#,咬到你了?
    yashika
        31
    yashika  
       325 天前   ❤️ 1
    我感觉你的问题应该是命名空间的范畴,早期 js 要敲一堆代码,现在依靠 namespace ,大大简化了导入要敲的代码了。
    java 是默认引用了一堆全局的 namespace ,而 js 这边要达到同样的编码体验就是要用 ts 了。其实现代 PHP 也是依靠命名空间解决了此类问题的,使得导入变的规范多了。大家都在借鉴 java 的成功之处,哈哈。
    zhangxh1023
        32
    zhangxh1023  
       312 天前
    js 的运行环境比较多,浏览器的 js ,Node.js 压根就不是一个东西。谁知道你要的是什么 js ,更不要说各类 js 的超集,打包工具,不同的模块规范。
    不如说,为什么编程语言引用其他文件的函数相对来说要麻烦一些。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4648 人在线   最高记录 6067   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 09:53 · PVG 17:53 · LAX 02:53 · JFK 05:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.