《nodejs概念篇》nodejs简介

nodejs是什么

参考链接:https://www.cnblogs.com/rixian/articles/10046591.html

nodejs简介

官方的介绍如下:
1、Nodejs是一个基于Chrome V8引擎的JavaScript运行环境。
2、Nodejs是一个使用了事件驱动、非阻塞式I/O的模型,使其轻量有高效。
3、Nodejs的包管理器是npm,是全球最大的开源库生态系统。
翻译成通俗语言就是:
1、Nodejs是一个能运行JavaScript的运行环境,类似于java是需要运行在JVM上,至于什么Chrome和V8,跟我们关系不大,都不用过分关注。
2、Nodejs很厉害。
3、Nodejs用的包管理器是npm,npm很厉害。

js引擎是什么

游览器能解析javascript、html、css、img等,其中js就是由js引擎解析的,说是引擎,通俗的讲就是能跑js的运行环境,它能解析javascript语言去做一些操作。

js只能在游览器吗

作为开发人员,我们知道javascript主要是对BOM(游览器对象)和DOM操作,但是javascript仅限于此吗?
由此引出,任何一门编程语言,他的能力不是由语言本身决定的,而是由他的运行环境决定的。
比如,java,他既是一门语言,也是一个运行环境(JVM等)
对于javascript,他的语言是ecmascript,以前的运行环境是游览器,游览器限制它只能操作BOM和DOM,它就只能如此。但是,现在出现了一个新的运行环境,能够让它有更多操作,这个运行环境就是nodejs,它能让js实现以前做不到的事情,比如说文件操作、网络操作、系统操作等。

nodejs模块化

参考链接:https://www.cnblogs.com/wangshuai1993/p/11905169.html

模块化思想由来

在javascript诞生之初,更多的是作为浏览器端的脚本语言而存在,很少会有人将它看作是一门真正的编程语言。随着各种前端库和框架的问世,javascript也被不断的封装,抽象,但始终缺少构建大型应用的基本特征:模块。java有类文件,c++有include,python有from...import,javascript却只能在html文件中通过script标签来进行引用,js的这一缺陷大大限制了其发展。
为了填补javascript没有模块系统,缺少标准库这些空白,社区专门制定了应用于javascript的模块化标准--CommonJS。CommonJS的问世大大增强了js的应用范围,NodeJS基本沿用了这一规范,但也进行了部分取舍,增加了些许自身的特性。

模块分类

nodejs分为两类,
一类是nodejs内部的模块,例如:http、fs、stream等,这些模块又被称为核心模块,这些模块在编译时会被编译成二进制文件,在启动时直接加载进内存,所以这些模块加载很快。
另一类是用户自定义组件,这些模块是运行时动态加载的,需要经历路径分析、文件定位、编译执行等过程,所以加载慢。

包管理器

由上述可知,Nodejs借用了CommenJs的模块化能力,但是,个人和公司开发大量的第三方模块发布在互联网上,如何管理互联网上这些大量模块?像是java有maven和gradle、python有pip、php有compose,nodejs是不是应该也需要一个第三方包管理器呢?需要!那就是npm

内部模块

nodejs主要作用是服务器开发平台,它能提供web服务器的一些基本功能,这些功能依托的就是内部模块,或者叫核心模块。如下:

  • http模块:处理http请求。
  • fs模块:对目录和文件进行操作。
  • process模块,实现进程操作。

此外,还有很多核心模块,比如:path、child_process、url等等。

优点

相较于java、php等这些早期服务器语言,为什么要使用nodejs呢?优势如下
1、前端开发人员都是使用js,所以用js开发服务器,对于前端开发人员来说,好上手。(开玩笑说说,等于公司招一个人能干两份活,公司肯定大力推广)
2、nodejs的单线程模式,使得不用像其他服务器语言一样进行加锁、解锁等操作。
3、nodejs是非阻塞I/O和事件驱动,能防止线程阻塞。
4、nodejs是服务器开发的后起之秀,自然会吸引更多目光,像大数据、元宇宙这些概念一样,会有炒作的热度。

npm是什么

参考链接:https://www.runoob.com/nodejs/nodejs-npm.html

npm简介

由上述可知,nodejs选用了npm做包管理器,所以在安装nodejs时,npm也会一起安装。(捆绑销售!!)

npm能做什么

从npm服务器下载第三方包到本地。
上传本地的包到npm服务器。

基本操作

// 查看版本
npm -v
// 安装模块,以express为例
npm install express
// 全局安装
npm install express -g
// 查看全局安装的包
npm list -g
// 查看某个包
npm list express
// 卸载模块
npm uninstall express
// 进入/node_modules,查看包是否存在(删完之后确认)
npm ls
// 更新模块
npm update express
// 搜索模块
npm search express

package.json

package.json 位于模块的目录下,用于定义包的属性。接下来让我们来看下 express 包的 package.json 文件,位于 node_modules/express/package.json 内容:

点击查看代码
{
  "name": "express",
  "description": "Fast, unopinionated, minimalist web framework",
  "version": "4.13.3",
  "author": {
    "name": "TJ Holowaychuk",
    "email": "tj@vision-media.ca"
  },
  "contributors": [
    {
      "name": "Aaron Heckmann",
      "email": "aaron.heckmann+github@gmail.com"
    },
    {
      "name": "Ciaran Jessup",
      "email": "ciaranj@gmail.com"
    },
    {
      "name": "Douglas Christopher Wilson",
      "email": "doug@somethingdoug.com"
    },
    {
      "name": "Guillermo Rauch",
      "email": "rauchg@gmail.com"
    },
    {
      "name": "Jonathan Ong",
      "email": "me@jongleberry.com"
    },
    {
      "name": "Roman Shtylman",
      "email": "shtylman+expressjs@gmail.com"
    },
    {
      "name": "Young Jae Sim",
      "email": "hanul@hanul.me"
    }
  ],
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/strongloop/express.git"
  },
  "homepage": "http://expressjs.com/",
  "keywords": [
    "express",
    "framework",
    "sinatra",
    "web",
    "rest",
    "restful",
    "router",
    "app",
    "api"
  ],
  "dependencies": {
    "accepts": "~1.2.12",
    "array-flatten": "1.1.1",
    "content-disposition": "0.5.0",
    "content-type": "~1.0.1",
    "cookie": "0.1.3",
    "cookie-signature": "1.0.6",
    "debug": "~2.2.0",
    "depd": "~1.0.1",
    "escape-html": "1.0.2",
    "etag": "~1.7.0",
    "finalhandler": "0.4.0",
    "fresh": "0.3.0",
    "merge-descriptors": "1.0.0",
    "methods": "~1.1.1",
    "on-finished": "~2.3.0",
    "parseurl": "~1.3.0",
    "path-to-regexp": "0.1.7",
    "proxy-addr": "~1.0.8",
    "qs": "4.0.0",
    "range-parser": "~1.0.2",
    "send": "0.13.0",
    "serve-static": "~1.10.0",
    "type-is": "~1.6.6",
    "utils-merge": "1.0.0",
    "vary": "~1.0.1"
  },
  "devDependencies": {
    "after": "0.8.1",
    "ejs": "2.3.3",
    "istanbul": "0.3.17",
    "marked": "0.3.5",
    "mocha": "2.2.5",
    "should": "7.0.2",
    "supertest": "1.0.1",
    "body-parser": "~1.13.3",
    "connect-redis": "~2.4.1",
    "cookie-parser": "~1.3.5",
    "cookie-session": "~1.2.0",
    "express-session": "~1.11.3",
    "jade": "~1.11.0",
    "method-override": "~2.3.5",
    "morgan": "~1.6.1",
    "multiparty": "~4.1.2",
    "vhost": "~3.0.1"
  },
  "engines": {
    "node": ">= 0.10.0"
  },
  "files": [
    "LICENSE",
    "History.md",
    "Readme.md",
    "index.js",
    "lib/"
  ],
  "scripts": {
    "test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/",
    "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/",
    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/",
    "test-tap": "mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/"
  },
  "gitHead": "ef7ad681b245fba023843ce94f6bcb8e275bbb8e",
  "bugs": {
    "url": "https://github.com/strongloop/express/issues"
  },
  "_id": "express@4.13.3",
  "_shasum": "ddb2f1fb4502bf33598d2b032b037960ca6c80a3",
  "_from": "express@*",
  "_npmVersion": "1.4.28",
  "_npmUser": {
    "name": "dougwilson",
    "email": "doug@somethingdoug.com"
  },
  "maintainers": [
    {
      "name": "tjholowaychuk",
      "email": "tj@vision-media.ca"
    },
    {
      "name": "jongleberry",
      "email": "jonathanrichardong@gmail.com"
    },
    {
      "name": "dougwilson",
      "email": "doug@somethingdoug.com"
    },
    {
      "name": "rfeng",
      "email": "enjoyjava@gmail.com"
    },
    {
      "name": "aredridel",
      "email": "aredridel@dinhe.net"
    },
    {
      "name": "strongloop",
      "email": "callback@strongloop.com"
    },
    {
      "name": "defunctzombie",
      "email": "shtylman@gmail.com"
    }
  ],
  "dist": {
    "shasum": "ddb2f1fb4502bf33598d2b032b037960ca6c80a3",
    "tarball": "http://registry.npmjs.org/express/-/express-4.13.3.tgz"
  },
  "directories": {},
  "_resolved": "https://registry.npmjs.org/express/-/express-4.13.3.tgz",
  "readme": "ERROR: No README data found!"
}

Package.json 属性说明

  • name - 包名。
  • version - 包的版本号。
  • description - 包的描述。
  • homepage - 包的官网 url 。
  • author - 包的作者姓名。
  • contributors - 包的其他贡献者姓名。
  • dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。
  • repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。
  • main - main 字段指定了程序的主入口文件,require('moduleName') 就会加载这个文件。这个字段的默认值是模块根目录下面的 index.js。
  • keywords - 关键字

NVM是什么

参考链接:https://www.cnblogs.com/jing-tian/p/11225123.html
就跟java有jdk1.6、jdk1.7等,nodejs也有很多版本。众多版本如何管理?
nvm 是 node.js 的版本管理工具,可以运行在多种操作系统上。

NVM下载

nvm-windows 最新下载地址:
https://github.com/coreybutler/nvm-windows/releases
image
可以看到这里又有四个可下载的文件。

  • nvm-noinstall.zip: 这个是绿色免安装版本,但是使用之前需要配置
  • nvm-setup.zip:这是一个安装包,下载之后点击安装,无需配置就可以使用,方便。
  • Source code(zip):zip压缩的源码
  • Sourc code(tar.gz):tar.gz的源码,一般用于Lnix系统

我对这个目前只是简单使用,为了方便,所以下载了nvm-set.zip文件。

安装

1第一个安装目录:这里没有使用默认的安装目录,修改安装目录为 D:\system\nvm
读者可自行决定安装目录
image

2第二个安装目录:添加 node.js 的安装目录
注意:
这里用 “添加 node.js 的安装目录” 的说法其实不太准确,准确的说法应该是配置 node.js 的安装目录
默认会使用 C:\Program Files\nodejs 目录,C:\Program Files\nodejs 目录也是 node.js 默认的安装目录
如果读者在安装 nvm 前就已经安装了 node.js,且修改了 node.js 的安装目录,那么此处的目录要修改为 node.js 的安装目录
如果读者在安装 nvm 前没有安装 node.js,那么此处的目录可自行定义
image

3点击安装,在安装过程中会弹出:由于已经安装了 node,所以此时提示“你希望nvm管理已经安装的 node 版本吗”,点击 是
待安装完成后测试是否安装成功

nvm -v

如果出现nvm版本号和一系列帮助指令,则说明nvm安装成功。
否则,可能会提示nvm: command not found

常用命令

nvm list  //查看目前已经安装的版本
nvm list available //显示可下载版本的部分列表
nvm install 10.15.0 //安装指定的版本的nodejs
nvm use 10.15.0 //使用指定版本的nodejs
npm install -g cnpm --registry=https://registry.npm.taobao.org  //使用淘宝镜像
posted @ 2023-05-08 16:23  Fusio  阅读(37)  评论(0编辑  收藏  举报