Node.js开发,使用Windows还是Linux?

38

我对基于 Node.js 平台的 Web 开发感兴趣。我的主机操作系统是 Windows 7。设置开发环境的首选方式是直接在主机上运行还是在基于 Linux 的虚拟机中运行?这两种方法之间有什么利弊呢?

如果选择虚拟机,我是否仍然可以在 Windows 中运行文本编辑器和 Web 浏览器(出于性能方面的考虑)?


6
Node.js 在 Windows 上运行得非常好,为什么要离开这个众所周知的环境呢? - Joachim Sauer
4
只是一种想法。有些环境在Linux上运行得更好,反之亦然。而且有些平台非常复杂,您可能希望将它们虚拟化。我认为,对于小项目来说,虚拟化Node.js开发环境没有任何好处? - Gabriel Smoljár
很多JS开发人员所编写的代码,长期来看最适合的平台只有一个是不可能的。 - Erik Reppen
Linux、NodeJS 和 NPM 开发者讨厌 Windows,实际上不使用它。他不会修复这个平台的错误。 - Bruno Finger
这只是我的个人观点,但是我认为Node社区似乎被一些苹果粉丝所占据,他们从未在Linux或Windows上进行过测试。因此,我发现除了OSx以外的任何平台上的应用程序开发都很麻烦。 - Shawn Whinnery
显示剩余2条评论
5个回答

44

根据经验,使用 Docker 而非 Linux。

编辑 使用 Docker。将依赖项打包在其中,在运行时挂载项目,仅针对特定版本的 LTS Node。与导致数天时间浪费强制升级到新包的无法运行的项目相比,我选择一个 2GB 的 Docker 镜像。

但是,作为一个在基于 Linux 的环境中开发了最近8年,并在过去6个月中在 Windows dot net 环境下使用 nodejs 开发软件的人来说,这是我的发现,不管是否令人震惊...

Windows 上的问题:

  • 不能有效地利用 Docker。Docker 工具包的最新版本解决了这个问题,至少在我看来是这样的。yymmv。
  • 大多数 Node 模块都需要 node_gyp,在表面上似乎并没有问题(因为 gyp 应该是跨平台编译器),但是当你深入研究如何在 Windows 上实现这一点时,除了安装 Visual Studio 以外,别无选择。由于几个原因,这让我感到非常沮丧:
  • 我通常在 Linux 上工作,所以我永远不想使用 Visual Studio。
  • 在 Windows 上编译某些东西最少需要安装一个 3GB 的 IDE,这完全是最荒谬的想法...不是库,而是一个我永远都不会打开的整体单块 GUI 软件。
  • Windows 上 debians 的等效软件包 build-essentials 实际上是一个零散的、错综复杂的、命名不规范的 GUI 安装器集合,分散在互联网上,需要特定的安装顺序。与 sudo apt-get install build-essentials 相比,这样做过于耗时且充满隐藏的麻烦。
  • 在 Windows 上开发将让你养成大小写混合路径名称的坏习惯,除非你的团队有一个严格的策略并加以执行,否则这将是一个问题的滑坡。
  • 虽然 Windows 支持超过256个字符的路径,但重要的工具不支持。rimraf 和 robocopy 就此登场...噫。

  • Windows终端及默认shell(cmd.exe)很糟糕...Powershell的语法过于冗长且不符合我的口味... 安装Cmder可以缓解这个问题,但Cmder与cmd.exe交互的唯一方法基本上是将按键复制到运行cmd.exe的隐藏窗口中(lolwut). Cmder在更加模块化的shell(zsh、bash等)中的表现要好得多。 更新:我现在使用带有pshazz和scoop的powershell,实际上非常好用。

  • 虽然终端和shell情况已经得到改善,但windows下的nodejs仍会假定您的环境变量为%OF% %THE% %WINDOWS% %VARIETY%... 而不是$UNIX $STYLE。因此,您基本上将主要从cmd.exe使用bower和npm... 更加让人沮丧。 我似乎不再遇到这个问题了,因为我混合使用了cross-env和commander或yargs。

    • 您还需要为Windows安装Python,这不是问题,因为有choco存在并支持您。 更新:看看boxstarter,它将通过配方(或者您可能真的可以升级到使用ansible或salt)来自动化新机器设置。

    • 有经验的Python、Ruby开发人员将告诉您,旧项目需要其引擎版本单独存储,以便在需要重新访问它们时使用(升级到较新版本通常不切实际或可行,即:兔子洞),因此您需要类似rvm和virtualenv的东西...

  • 在 Unix 系统中,nvm 只能在 Linux 和 macOS 上使用,因为它是一组 Bash 脚本。我建议您使用 ZSH 作为您的 shell,并使用 Zgen 和 Tarrasch/zsh-autoenv 插件。

  • nodeenv 更可能是一个与 virtualenv 集成的 Python 程序。有些人喜欢这个工具,但我们团队使用的是 nvm。
  • 然而,如果您使用的是 Windows 系统,您最好选择 nvm-windows,因为"原因"。 忘了吧,使用nodist 在 Windows 上会是更好的选择......非常好的选择,您不需要担心某种自动环境变量,因为 nodist 设计上就处理了这个问题。
  • 在 Windows 上安装:

    1. 安装 Chocolatey。
    2. choco install cmder nodejs python2 choco install python2
    3. 安装 http://scoop.sh,然后使用它来安装 pshazz。
    4. 手动删除任何全局安装的 Node 版本。
    5. 安装 nvm-windows。 安装 nodist。
    6. 安装 Visual Studio 2012 Express,但如果您关心您的 CPU 循环,永远不要启动它。这可能是过度的,因为微软已经发布了与 build-essentials 等效的东西。
    7. 安装 Windows 7/10 64bit SDK。

    在 Linux 上遇到的问题:

    简而言之,请使用 nvm。有更多原因可以选择它。

    • 您将不得不将全局 npm 的 node_modules 路径设置为用户拥有的目录(我已开始使用 ~/.local/share/npm)。令人愉悦的是,这是我发现的 Windows 安装 Node.js 做对了的事情(可能不是有意的)。如果使用 nvm,则这不是一个问题。
    • Ubuntu 已经有一个名为 node 的二进制文件,因此默认情况下 #!/usr/bin/env node 将不会运行 nodejs。幸运的是,Debian 系统有一个方便的管理工具用于控制 env 二进制文件发出的内容:update-alternatives。请忽略在此处使用符号链接的建议,这只会在以后以微妙的方式引起问题。如果使用 nvm,则这也不是一个问题。

    在 Linux 上安装:

    $ sudo apt-get install git-core git-flow build-essentials python-dev python-  pip
    $ curl https://raw.githubusercontent.com/creationix/nvm/v0.20.0/install.sh | bash
    $ npm config set prefix ~/.local/share/npm
    $ nvm install stable
    $ nvm alias default stable
    

    参考资料:


    5
    我同意,如果你想少遇到NodeJS和它的包方面的麻烦,那就使用Linux系统吧。 - J86
    我们在Windows上使用Node时一直遇到问题,后来转而使用Docker来规范我们的开发环境。这是非常好的经验,自从转换后就再也没有遇到过问题。现在我们也具备了第三方依赖和离线抗性。 - airtonix

    22
    我们有一个系统,通过使用一个配置文件来处理所有问题,例如路径差异("c:\blarg""~user/blarg"),并且作为奖励,让我们可以控制调试和生产环境之间的差异。
    Node.js是跨平台的,所以我们完全可以在各种计算机上工作,没有任何问题。
    这是我在文件存储项目中使用的示例配置文件:
    /**
     * All of these are mandatory except for log_level (which defaults to "info", 1) 
     * and log_echo_to_console (which defaults to false)
     */
    exports.config = {
        log_level: 0,
        log_file: "/path/to/send.log",
        request_log_file: "/path/to/send_requests.log",
        log_echo_to_console: true,
        port_number: 8088,
        no_notification_emails: true,
        image_url_base: "http://s3.amazonaws.com/",      // MAKE SURE THIS ENDS IN "/"
        tmp_file_folder:"/tmp/",
        s3_info: {
            key: 'xxxxxx',
            secret: 'yyyyy',
            file_bucket: 'sendtransfer/',
        },
        backend_info: {
            db_info: {
                server: "localhost",
                user: "db_user",
                password: "secret",
                database: "SendRemote",
                pooled_connections: 125,
                idle_timeout_millis: 30000
            },
            memcache_info: {
                host: "127.0.0.1",
                port: "31111",
                pooled_connections: 200,
                timeout: 20000
            }
        },
    
        debug_server: true
    };
    

    对于 Windows 机器,只需更改路径即可。没问题!

    然后在代码中,您可以直接输入:

    var local = require('local.config.js');
    fs.writeFile(local.config.log_file);
    // etc
    

    拥抱多元文化!!!


    3
    所有的第三方模块都支持跨平台吗?例如mongooid、express和restify? - Gabriel Smoljár
    1
    到目前为止,我从未遇到过任何问题。我们使用了许多不同的模块,但没有出现问题。理论上,当您安装它们时,Node模块将自动为各种平台进行配置。我想可能会有问题,但迄今为止我们还没有看到任何问题。 - MarcWan
    尝试在Windows上安装topojson!这太麻烦了,我不得不在虚拟机中安装Ubuntu!:( - J86

    6
    我也使用Windows 7,并在Virtualbox中使用Linux(Debian)作为客户机,我建议这样做,因为我在命令行中比在Windows中点击更快地完成一些任务。另一个好处是,如果您将VM放在USB驱动器上,您可以随身携带它,并在安装了Virtualbox Host的任何地方使用它,因此您可以将整个开发环境随身携带。在Windows中使用您喜欢的文本编辑器或浏览器也没有问题,只需安装Samba并将您的主目录挂载到Windows中即可。同样适用于您的浏览器,因为VM只是LAN中的另一台机器,所以不要将浏览器指向localhost,而是指向VM的IP即可。显然的缺点是,如果您还没有Linux经验,那么您可能应该坚持使用Windows,因为这需要一些时间来适应。

    我喜欢用USB移动你的环境这个想法哈哈。 - Amir Savand

    2

    我只是提供一些建议:

    我建议你选择第三种选项:双重安装windows/ubuntu(最好选择最友好的图形用户界面ubuntu发行版),并研究这个选项,这样你就会更加熟悉Linux/Unix甚至iOS,这将使你更好地理解Windows并成为更好的程序员。有时虚拟机速度太慢,而Linux在资源利用方面非常高效。

    如果您有安装虚拟机的能力,您也可以尝试安装Linux发行版,并熟悉这种基于语言/系统的操作系统,这是许多Web结构的基础。


    0

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