这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战
Node.js简介
Node.js是一个基于Chrome V8引擎的、跨平台的JavaScript运行环境。
在同一个设备上如何快速切换Node.js版本?
- n: 一个npm全局的开源包,是依赖npm来全局安装、使用的。
- fnm: 快速简单,兼容性支持.node-version和.nvmrc文件
- nvm: 独立的软件包,Node Version Manager
Node.js的特点
异步I/O
当Node执行IO操作时,会在响应返回并恢复操作,而不是阻塞线程并浪费CPU循环等待。
单线程
Node保持了JS在浏览器中单线程的特点。在浏览器中,有browser进程,插件进程,GPU进程,渲染进程。
- 优点:不用处处在意状态同步的问题,不会发生死锁,没有线程上下文切换带来的性能开销。
- 缺点:无法利用多核CPU。错误会引起整个应用退出,健壮性不足。大量计算占用导致CPU无法继续执行。
跨平台
兼容Windows和*nix平台,主要得益于在操作系统与Node.js上层模块之间构建了一层平台架构。node适合IO密集型领域。
模块化机制
何为模块化?
根据功能或业务将一个大程序拆分成互相依赖的小文件,再用简单的方式拼接起来。
2.为什么需要模块化?无模块化会有哪些问题
所有script标签必须保证顺序正确,否则会依赖报错。
全局变量存在命名冲突,占用内存无法被回收。
IIFE/namespace会导致代码可读性低等诸多问题。
CommonJS规范
Node.js支持CommonJS模块规范,采用同步机制加载模块。
加载方式
- 加载内置模块 require('fs')
- 加载 相对或绝对路径的文件模块
- require('/User/.../file.js')
- require('./file.js')
- 加载npm 包 require('lodash')
Npm 包查找原则
以require('lodash')为例,查找的顺序分别为:
-
当前目录
node_modules -
如果没有,父级目录的
ndoe_modules -
如果没有,沿着路径向上递归,直到根目录下
node_modules -
找到之后会加载
package.json.main指向的文件,如果没有package.json则依次查找Index.js、index.json、index.node
缓存
require.cache中缓存着加载过的模块,缓存的原因:同步加载
- 文件模块查找耗时时,如果每次require都需要重新遍历查找,性能会比较差;
- 在实际开发中,模块可能包含副作用代码。
其他模块化规范
-
AMD是RequireJS在推广过程中规范化产出,异步加载,推崇依赖前置;
-
CMD是SeaJS在推广过程中规范化产出,异步加载,推崇就近依赖;
-
UMD规范兼容AMD和CommonJS模式
-
ES Modules(ESM),语言层面的模块化规范,与环境无关,可借助babel编译
包管理机制
npm介绍
npm是Node.js 的包管理器。文件目录最少有index.js和package.json,一个包里可以包含多个模块,一个模块里又可以依赖多个包。常用命令有:
npm init
npm config
npm run [cmd]
npm install [pkg]
npm uninstall [pkg]
npm update [pkg]
npm info [pkg]
npm publish
这里看一下package.json里面有哪些东西
- name 包名称
- version 版本号
- main 入口文件
- scripts 执行脚本
- dependencies 线上依赖
- devDependencies 开发依赖
- repository 代码托管地址 除此之外还有很多配置等待发掘。
很多包会经常更新,那么版本号如何去写?方便我们开发时使用呢?
可以通过这个网站 查看包的各个版本。
依赖
最下面两个很少用
-
dependencies 业务依赖,应用发布后正常执行所需要的包
-
devDependencies 开发依赖,只用于开发环境
-
peerDependencies 同等依赖,比如一个 webpack 插件依赖特定版本的 webpack
-
bundledDependencies 打包依赖(npm run pack),必须已经在 devDep 或者 dep声明过
-
optionalDependencies 可选依赖
私有npm
平常的包一般都是托管在npmjs.com平台,但是有些公司内部的包,比如涉及隐私的情况,所以公司一般有私有npm,可以发在私有平台上。
有时候下载某些包可能会遇到速度慢的问题,可以设置淘宝之类的私有代理,提升下载速度。
另外有时候会遇到锁包的情况,如果开发周期长版本更新或者同事不小心升级了自己的包版本,就可能带来兼容性问题。可以借助package-lock.json锁文件,防止自动升级版本。
现在npm版本出到了7了,后面还出了yarn和pnpm等工具,pnpm解决了一些扁平化带来的问题。
除此之外,课程中还讲了异步编程、web应用开发、开发调试、线上部署。我会放到下一篇继续记录笔记。