Backend | 关于Node.js、NPM和Node_modules

r/ProgrammerHumor - Sun Neutron star Black hole node_modules HEAVIEST OBJECTS IN THE UNIVERSE

是什么

首先看了一下Node.js官网的介绍。

As an asynchronous event-driven JavaScript runtime, Node.js is designed to build scalable network applications.

说的都是什么鬼话,一句没看明白。让我们来看看人话是什么样的。

Node.js, which is a run-time environment that includes everything required to execute a program written in JavaScript.

Node.js is neither a programming language nor a framework; it’s an environment for them.

  • Node.js是用JavaScript写程序时的一个运行时环境。

NPM is Node.js’s package ecosystem. It is the largest ecosystem of all open-source libraries in the world, with over 1 million packages and growing. NPM is free to use, and thousands of open source developers contribute to it daily.

  • NPM是Node.js的包生态系统,也就是管理package的。这是世界上最大的一个开源库生态,据说每天都会有200多个新的package被注册。
  • 根据项目中的package.json或package-lock.json文件,利用npm install就可以安装项目所有的依赖库,并存储在node_modules下。

与Python库管理的区别

  • npm vs. pip

    • npm使用的是局部依赖,所以相同的module会被反复安装到每个项目以及每个可传递的依赖项上( The same module is installed over and over again for every project and every transitive dependency)。一个package可以是一个tar包,也可以是本地file协议,甚至git仓库地址。所以,node_module——HEAVIEST OBJECTS IN THE UNIVERSE。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      node_modules
      mod-a
      node_modules
      mod-b@1.0
      mod-c
      node_modules
      mod-b@2.0
      mod-d
      node-modules
      mod-b@2.0

      虽然mod-c和mod-b依赖同一个mod-b版本,但是该版本却安装了两遍。如果应用了很多第三方库,同时第三方库依赖了一些很基础的第三方库(如lodash),node_modules里就会充满各种重复版本的lodash。

    • 而pip使用的全局依赖(至少对于虚拟环境而言是全局依赖的),所以就避免了上述问题。

  • standard library python vs. JS

    • Python的标准库比较大,与JS的标准库相比。
    • 所以JS会依赖更多的packages。
  • 我觉得可以把node.js类比于anaconda,都像环境和容器一样。

ICARUS的npm版本和git版本

首先我的blog是基于hexo的。

  • 因为有两个版本可以安装,npm install下来的就是直接到node_modules里,其实就是github repo的一个注册包版本(node_modules/hexo-theme-icarus包含package.json,所以它是一个package而不是一个module?不过我的觉得package和module的区分不重要)。
  • 而git clone安装方法是存在themes文件夹下面。

如果我想修改一些主页的设置,就需要改主题的源代码,但是他是以npm的方式安装的,虽然直接修改也能生效(因为是本地路径查询包,所以直接修改node_modules中的库也是没问题的吧?),但是这种方法十分的不优雅(比如某天重新装了一下node_modules就全G了)。

推荐的方法是利用git clone安装到theme文件下,也就是自己的项目里,然后修改好了闲的没事的话可以注册到npm上,这样别人也能使用你修改后的icarus plus版本了,而且npm直接安装一下,十分的方便。

Backend | 关于Node.js、NPM和Node_modules

https://jennyvanessa.github.io/2023/02/24/2302241356/

Author

Vanessa Ni

Posted on

2023-02-24

Updated on

2023-02-24

Licensed under

Comments

You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.