【青训营】- Node.js基础入门笔记 - 上

430 阅读4分钟

这是我参与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循环等待。

image.png

单线程

Node保持了JS在浏览器中单线程的特点。在浏览器中,有browser进程,插件进程,GPU进程,渲染进程。

  • 优点:不用处处在意状态同步的问题,不会发生死锁,没有线程上下文切换带来的性能开销。
  • 缺点:无法利用多核CPU。错误会引起整个应用退出,健壮性不足。大量计算占用导致CPU无法继续执行。

跨平台

兼容Windows*nix平台,主要得益于在操作系统与Node.js上层模块之间构建了一层平台架构。node适合IO密集型领域。 image.png

模块化机制

何为模块化?

根据功能或业务将一个大程序拆分成互相依赖的小文件,再用简单的方式拼接起来。

2.为什么需要模块化?无模块化会有哪些问题

所有script标签必须保证顺序正确,否则会依赖报错。

全局变量存在命名冲突,占用内存无法被回收。

IIFE/namespace会导致代码可读性低等诸多问题。

CommonJS规范

Node.js支持CommonJS模块规范,采用同步机制加载模块。

加载方式

  1. 加载内置模块 require('fs')
  2. 加载 相对或绝对路径的文件模块
  • require('/User/.../file.js')
  • require('./file.js')
  1. 加载npm 包 require('lodash')

Npm 包查找原则

以require('lodash')为例,查找的顺序分别为:

  • 当前目录 node_modules

  • 如果没有,父级目录的ndoe_modules

  • 如果没有,沿着路径向上递归,直到根目录下node_modules

  • 找到之后会加载package.json.main指向的文件,如果没有package.json则依次查找Index.js、index.json、index.node

image.png

缓存

require.cache中缓存着加载过的模块,缓存的原因:同步加载

  1. 文件模块查找耗时时,如果每次require都需要重新遍历查找,性能会比较差;
  2. 在实际开发中,模块可能包含副作用代码。

其他模块化规范

  • AMD是RequireJS在推广过程中规范化产出,异步加载,推崇依赖前置;

  • CMD是SeaJS在推广过程中规范化产出,异步加载,推崇就近依赖;

  • UMD规范兼容AMD和CommonJS模式

  • ES Modules(ESM),语言层面的模块化规范,与环境无关,可借助babel编译

image.png

包管理机制

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 代码托管地址 除此之外还有很多配置等待发掘。

很多包会经常更新,那么版本号如何去写?方便我们开发时使用呢?

image.png 可以通过这个网站 查看包的各个版本。

依赖

最下面两个很少用

  • 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应用开发开发调试线上部署。我会放到下一篇继续记录笔记。