Backend | 关于Node.js、NPM和Node_modules
是什么
首先看了一下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
10node_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