《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
可以看到这里又有四个可下载的文件。
- nvm-noinstall.zip: 这个是绿色免安装版本,但是使用之前需要配置
- nvm-setup.zip:这是一个安装包,下载之后点击安装,无需配置就可以使用,方便。
- Source code(zip):zip压缩的源码
- Sourc code(tar.gz):tar.gz的源码,一般用于Lnix系统
我对这个目前只是简单使用,为了方便,所以下载了nvm-set.zip文件。
安装
1第一个安装目录:这里没有使用默认的安装目录,修改安装目录为 D:\system\nvm
读者可自行决定安装目录
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,那么此处的目录可自行定义
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 //使用淘宝镜像