寸头男生:

Node.js入门

node.js是基于chrome V8引擎的JavaScript执行软件

node.js也就是JavaScript的解析器,提供了js的运行环境

以前JavaScript的代码都是由客户端游览器解析,运行环境是游览器,游览器有安全级别限制。所以没有操作磁盘⽂件IO以及⽹络编程,处理⽹络请求,搭建HTTP服务器等功能操作。有了node.js,JavaScript不仅能完成如上功能,还能跨平台运行,在服务器端运行。js也能作为后端语言。

node.js的特性:

文件读写(File System)

进程管理(Process)

网络通信(HTTP/HTTPS)

以上特性以游览器作为运行环境时都不能操作。

Nvm(node.js version management,node的版本管理工具)

由于node.js有许多版本,不同项目需要对应版本才可以运行。我们可以先安装Nvm就可以管理并安装多个node.js。

下载地址:github.com/coreybutler…

解压后安装nvm,安装时保存下Nvm与node.js的路径,后面直接下一步下一步

Nvm的安装路径:C:\Users\code\AppData\Roaming\nvm(默认)

安装Nvm时指定node.js的安装路径:C:\Program Files\nodejs(默认)

在Nvm路径中的找到settings.txt文件,将下面代码复制进去,可以加快node版本的下载:

node_mirror: https://npm.taobao.org/mirrors/node/

npm_mirror: https://npmtaobao.org/mirrors/npm/

复制代码

nvm -v 或 nvm version:查看nvm版本

nvm list:查看当前电脑上安装的node版本

nvm install node版本=:下载node.js

nvm uninstall node版本号:卸载指定版本的Node.js

nvm use node版本号:设置当前需要使用的node版本

在vs code中使用node命令,安装Code Runner

进程与线程

进程(process)是资源分配的最小单位,线程(thread)是cpu进行运算调度的最小单位,线程包含在进程之中。

进程

进程负责为程序的运行环境提供必备的环境

如果把cpu比作工厂,进程相当于工厂中的车间

线程

线程是计算机中最小的计算单位,线程负责执行进程中的程序

线程就相当于工厂中的工人

单线程:

单线程就相当于是一个人干活

比如js,游览器就是单线程的,当然node.js也是单线程

多线程:

多线程相当于是多个人干活。单线程不是绝对的差,多线程也不是绝对的好(这里不做详细解释)。

java是多线程

node.js模块化

基本概念:

一个js文件就是一个模块。

每一个模块都是一个独立的作用域,默认里面定义的任何数据(变量,函数,对象…)都是私有的,外部无法访问。

模块可以指定数据对外开放

CommonJS规范:

CommonJS定义了模块化的标准。模块引用,模块定义,模块标识。

CommonJS是一种规范,NodeJS是这种规范的实现(需要详细了解Common.js点击这里)。

node中模块分类:

内置模块

node自带模块,不需要通过npm安装,可以直接通过名字调用。

第三方模块

需要通过npm安装的模块

自定义模块

自己创建的js文件,通过文件路径引入(相对路径 或 绝对路径)

node中的模块是由一个函数包裹:

解析:

node中有一个全局对象global,类似于网页中的window对象

在全局中创建的变量会作为global的属性保存

在全局中创建的函数会作为global的方法保存

我们在模块中声明一个变量a,打印global发现global中并没有属性a。所以:模块中的数据没有声明在全局,模块中并不是一个全局作用域。

console.log(arguments);//打印函数中的arguments,node模块中有arguments并且发现其中有5个参数。

console.log(arguments.callee+"");//callee属性可以找到原函数,再利用拼接字符串的方式打印。结果:function (exports, require, module, __filename, __dirname) {…},所以:node中的模块包裹在一个函数中。

解析参数:

- exports

用于向外暴露数据

- require

用于引入外部模块

- module

代表的是当前模块本身

exports就是module的属性,向外暴露的数据在module.exports中

- filename

当前模块完整路径

- dirname

当前模块所在文件夹的路径

复制代码

require(’’) ,module.exports,exports 解析:

require(’’):

在node中我们使用require引入模块,require()中可以传入一个js文件的路径作为参数(也称模块标识),node根据路径引入模块,如果使用相对路径,必须以 . 或 … 开头

require()引入模块后,会返回一个对象,这个对象就是引入的模块

module.exports:

module对象中有一个exports属性。用于对外导出变量,方法或整个模块。

exports:

exports是module.exports的引用,所以exports用于向module.exports指向的内存块中添加属性。

因为node模块中的函数返回的是module.exports指向的内存块,所以export=…是错误的,这样会改变exports的引用的内存地址。

exports与module.exports的区别:

前者公开了它指向的对象。 后者公开了它指向的对象的属性(node官方文档原话!!)。

总结:模块中的代码都是包含在一个函数中,函数执行时,会同时传递5个实参

NPM(Node Package Manager,node包管理工具)

在node.js中我们将相关模块放入一个文件夹,形成一组完整的工具我们称为包。

一个包中应包含的文件:

package.json 当前包的描述文件

bin 可执行二进制文件

lib js代码

doc 文档

test 单元测试

其他文件都不怎么重要,但是package.json是必要的文件

通过package.json可以详细表达一个项目

描述文件的相关示例:

(这里引用的文章)

{

“name”: “exchange”,

“version”: “0.1.0”,

“author”: "zhangsan ",

“description”: “第一个node.js程序”,

“keywords”:[“node.js”,“javascript”],

“private”: true,

“bugs”:{“url”:“http://path/to/bug”,“email”:“bug@example.com”},

“contributors”:[{“name”:“李四”,“email”:“lisi@example.com”}],

“repository”: {

“type”: “git”,

“url”: “https://path/to/url”

},

“homepage”: “http://necolas.github.io/normalize.css”,

“license”:“MIT”,

“dependencies”: {

“react”: “^16.8.6”,

“react-dom”: “^16.8.6”,

“react-router-dom”: “^5.0.1”,

“react-scripts”: “3.0.1”

},

“devDependencies”: {

“browserify”: “~13.0.0”,

“karma-browserify”: “~5.0.1”

},

“scripts”: {

“start”: “react-scripts start”,

“build”: “react-scripts build”,

“test”: “react-scripts test”,

“eject”: “react-scripts eject”

},

“bin”: {

“webpack”: “./bin/webpack.js”

},

“main”: “lib/webpack.js”,

“module”: “es/index.js”,

“eslintConfig”: {

“extends”: “react-app”

},

“engines” : {

“node” : “>=0.10.3 <0.12”

},

“browserslist”: {

“production”: [

“>0.2%”,

“not dead”,

“not op_mini all”

],

“development”: [

“last 1 chrome version”,

“last 1 firefox version”,

“last 1 safari version”

]

},

“style”: [

“./node_modules/tipso/src/tipso.css”

],

“files”: [

“lib/”,

“bin/”,

“buildin/”,

“declarations/”,

“hot/”,

“web_modules/”,

“schemas/”,

“SECURITY.md”

]

}

注意如下解析不能放入json文件,json文件中也不能写注释:

package.json 文件配置说明:

name:项目/模块名称,长度必须小于等于214个字符,不能以"."(点)或者"_"(下划线)开头,不能包含大写字母。

version:项目版本。

author:项目开发者,它的值是你在https://npmjs.org网站的有效账户名,遵循“账户名<邮件>”的规则,例如:zhangsan zhangsan@163.com。

description:项目描述,是一个字符串。它可以帮助人们在使用npm search时找到这个包。

keywords:项目关键字,是一个字符串数组。它可以帮助人们在使用npm search时找到这个包。

private:是否私有,设置为 true 时,npm 拒绝发布。

license:软件授权条款,让用户知道他们的使用权利和限制。

bugs:bug 提交地址。

contributors:项目贡献者 。

repository:项目仓库地址。

homepage:项目包的官网 URL。

dependencies:生产环境下,项目运行所需依赖。

devDependencies:开发环境下,项目所需依赖。

scripts:执行 npm 脚本命令简写,比如 “start”: “react-scripts start”, 执行 npm start 就是运行 “react-scripts start”。

bin:内部命令对应的可执行文件的路径。

main:项目默认执行文件,比如 require(‘webpack’);就会默认加载 lib 目录下的 webpack.js 文件,如果没有设置,则默认加载项目跟目录下的 index.js 文件。

module:是以 ES Module(也就是 ES6)模块化方式进行加载,因为早期没有 ES6 模块化方案时,都是遵循 CommonJS 规范,而 CommonJS 规范的包是以 main 的方式表示入口文件的,为了区分就新增了 module 方式,但是 ES6 模块化方案效率更高,所以会优先查看是否有 module 字段,没有才使用 main 字段。

eslintConfig:EsLint 检查文件配置,自动读取验证。

engines:项目运行的平台。

browserslist:供浏览器使用的版本列表。

style:供浏览器使用时,样式文件所在的位置;样式文件打包工具parcelify,通过它知道样式文件的打包位置。

files:被项目包含的文件名数组。

复制代码

NPM 解析:

NPM是随同Node.js一起安装的包管理工具,主要用处有:

可以从npm服务器中下载别人编写第三方包到本地使用。

可以从NPM服务器下载并安装别人编写的命令行程序到本地使用。

可以将自己编写的包或命令行程序上传到NPM服务器供别人使用。

npm完成了第三方模块的发布、安装和依赖等,使得Node与的三方模块之间形成了良好的生态系统

一般下载Node.js会自带npm,但是如果使用nvm(Node版本管理工具)下载的node其中不会自带npm。

npm的不生效参考地址

npm中下载的包在js文件中也是通过require()调用,因为是npm下载的所以不用写路径

NPM 常用命令:

npm init 初始化package.json(描述文件)

npm init -y 一次初始化package.json

npm -v 查看npm版本

npm version 查看详细版本

npm view versions 查看指定包的所有版本

npm search 搜索包

npm install 安装包,会自动添加到描述文件的依赖中(package.json中的dependencies)

一般下载的包是不会随着项目上传(一般git hub中的node项目都不会带包),因为这样会影响项目上传下载速度。

因为描述文件中有依赖(dependencies),Node项目下载后,直接npm install就能把项目所依赖的包一次全部下载到本地

npm install --production 只装dependencies中记录的包

npm install @版本 安装指定版本的包

npm install 安装项目依赖的所有包

npm uninstall 删除包

npm uninstall -save/S 删除描述文件中依赖的记录

npm uninstall -D 会将其安装为开发依赖项(会被添加到 devDependencies 列表)

npm install -g 安装全局包(全局安装的包一般都是一些工具)

npm uninstall -g 删除全局包

npm list -g --depth 0 查看全局包

npm update 更新指定的包

npm update 更新所有的包

npm cache clean --force 清除npm缓存

描述文件中的脚本:

在描述文件中有个scripts:{}这表示是一个脚本,脚本就是可以运行命令行里面的命令。

假如里面有个scripts{“dev”:“文件名 -v”},我们就可以npm run dev 执行这个命令。

复制代码

node描述文件中包版本控制符:

这是某个包的版本:13.4.6

major(主版本): 13, minor(次版本):4,patch(修补版本):6

^ :锁定major

~:锁定major与minor

:全部锁定

*:最新版本

版本锁定后使用 npm update 只会更新没有锁定的

CNPM 中国npm镜像客户端(但我觉得没必要使用):

由于npm服务器在国外,下载比较慢。阿里团队做了cnpm国内镜像,镜像每10分钟与官方npm服务器同步一次。使得我们不仅能加快下载速度还可以使用到新版本的包。

安装cnpm:npm install cnpm -g --registry=registry.npm.taobao.org

使用只要在npm的前面加个c

Node搜索包的流程:

Node在使用模块名字来引入模块时,它会首先在当前目录的node_modules中寻找是否含有该模块,如果有,直接使用;如果没有,则去上一级目录的node_modules中寻找,如果有,直接使用;如果没有则再去上一级目录node_modules寻找,直到找到为止。直到找到磁盘的根目录,如果没有,则报错。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值