node.js安装

node20 二进制安装 ubantu23

 
nodejs项目不支持从本地盘转到移动磁盘,因为移动磁盘不支持软链接的创建,
而nodejs项目中有软链接的创建,但node_modules之外的其他目录是可以同步的 

$ gcc -dumpversion
12

mkdir -p /wks/nodejs/app 
cd /wks/nodejs/app/
wget https://nodejs.org/dist/v20.9.0/node-v20.9.0-linux-x64.tar.xz
tar -xvf node-v20.9.0-linux-x64.tar.xz
cd node-v20.9.0-linux-x64/

添加环境变量
vim ~/.bashrc
export NODEWKS=/wks/nodejs
export NODE_BASE=$NODEWKS/app/node-v20.9.0-linux-x64
export PATH=$NODE_BASE/bin:$PATH
export NODE_GLOBAL=$NODE_BASE/global
export PATH=$NODE_GLOBAL/bin:$PATH

$ . ~/.bashrc 
$ which node 
/wks/nodejs/app/node-v20.9.0-linux-x64/bin/node
$ npm -v
10.1.0

NODE配置 
mkdir -p "$NODE_BASE/global"
mkdir -p "$NODE_BASE/cache"
npm config set prefix "$NODE_BASE/global"
npm config set cache "$NODE_BASE/cache"


npm install -g yarn

下面的根据需要安装,不需要就不用设置
yarn config set -g registry http://mirrors.cloud.tencent.com/npm/
yarn config set -g sass_binary_site http://mirrors.cloud.tencent.com/npm/node-sass/

node.js安装

 
二进制安装:就是已经提前编译好的,比如下面的就是二进制的,不需要configure编译
https://nodejs.org/en/download
https://nodejs.org/dist

其他版本下载,
https://nodejs.org/dist/v14.17.0/
https://nodejs.org/dist/v14.17.0/node-v14.17.0-linux-x64.tar.gz

https://nodejs.org/dist/v18.15.0/


编译安装,不下载二进制,node的版本不能低于12.10
https://cdn.npmmirror.com/binaries/node/v14.17.5/node-v14.17.5.tar.gz

编译安装是类似下面这样的,没有bin,需要configure编译
wget https://cdn.npmmirror.com/binaries/node/v12.16.0/node-v12.16.0.tar.gz
wget https://cdn.npmmirror.com/binaries/node/v14.17.5/node-v14.17.5.tar.gz
mkdir -p /opt/app/node14
tar -xvf node-v14.17.5.tar.gz
cd node-v14.17.5/

$ ./configure --prefix=/opt/app/node14 
Node.js configure: Found Python 3.10.7...
Please use python3.9 or python3.8 or python3.7 or python3.6 or python3.5 or python2.7.

$ sudo su - root
# which python2.7
# apt install python2.7
# which python2.7
/usr/bin/python2.7
# /usr/bin/python2.7 ./configure --prefix=/opt/app/node14 
make
make install

其中make这一步编译将近1小时,安装后压缩保存,后续直接使用,
本次安装为ubantu20.10上编译的node14.17,压缩为node14.tar.gz

cd  /opt/app/node14 
mkdir -p node_modules/{global,cache}

环境变量配置
vim /etc/profile
export NODE_BASE=/opt/app/node14 
export NODEWKS=/opt/tpf/nodejs
export NODE_PATH=$NODEWKS/blog1/node_modules   
export PATH=$NODE_BASE/bin:$NODE_BASE/node_modules/global/.bin:$NODE_PATH/.bin:$PATH

source /etc/profile

NODE配置 
npm config set prefix "$NODE_BASE/global"
npm config set cache "$NODE_BASE/cache"


nodejs简介

npmjs.com

 
通常npm能安装的JS包,可以在下面的网址上找到其使用说明
https://www.npmjs.com/

事件驱动

 
nodejs是单线程,每次的web请求交由事件循环处理,
事件本身处理的内容是异步的,不会占用这个循环多少时间,因此效率不低。

事件循环

 
Node.js 是单进程单线程应用程序
异步..支持回调函数
事件机制用观察者模式实现
单线程类似进入一个while(true)的事件循环,直到通知完所有事件观察者才退出,
每个异步事件都有一个事件观察者,如果有事件发生就会通知该事件观察者(调用该回调函数).

观察者模式

 
定义一种一对多的依赖关系;被观察者发生变化时,会通知所有的观察者

每个被观察者对应的方法有,添加/删除/通知 观察者 

nodejs简单服务器

server.js

 
let http = require("http");

http.createServer(function (request, response) {

    // 发送 HTTP 头部
    // HTTP 状态值: 200 : OK
    // 内容类型: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});

    // 发送响应数据 
    response.end('begin start node.js\n');
}).listen(8008);

// 终端打印如下信息
console.log('http://127.0.0.1:8008/');

 
$ node server.js 
http://127.0.0.1:8888/

包管理工具

 
升级
sudo npm install npm -g

淘宝镜像
sudo npm install -g cnpm --registry=https://registry.npm.taobao.org

    
本地安装
---------------------------------------
将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),
如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
可以通过 require() 来引入本地安装的包。
npm install express

    
全局安装
------------------------------------------------------------
安装包放在 /usr/local 下或者你 node 的安装目录
可以直接在命令行里使用。

如果你希望具备两者功能,则需要在两个地方安装它或使用 npm link。
/usr/local/lib/node_modules
npm install express -g

    
查看安装信息
---------------------------------------
查看所有全局安装的模块
npm list -g

如果要查看某个模块的版本号,可以使用命令如下:
npm list grunt

卸载模块
-----------------------
npm uninstall express
到 /node_modules/ 目录下查看包是否还存在,或者使用以下命令查看
npm ls

更新模块
npm update express

搜索模块
npm search express

创建模块
-----------------------
npm init
输入相关信息,可以生成一个package.json
在 npm 资源库中注册用户(使用邮箱注册):
npm adduser

发布模块
npm publish


版本号
-----------------------
NPM使用语义版本号来管理代码。语义版本号分为X.Y.Z三位,分别代表主版本号、次版本号和补丁版本号。当代码变更时,版本号按以下原则更新。
如果只是修复bug,需要更新Z位
如果是新增了功能,但是向下兼容,需要更新Y位。
如果有大变动,向下不兼容,需要更新X位。

Yarn简介

 
Yarn 是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具。
就像我们可以从官方文档了解那样,它的目的是解决这些团队使用 npm 面临的少数问题.
    
npm install -g yarn
yarn config set -g registry http://mirrors.cloud.tencent.com/npm/
yarn config set -g sass_binary_site http://mirrors.cloud.tencent.com/npm/node-sass/

使用 package.json

 
package.json 位于模块的目录下,用于定义包的属性。
接下来让我们来看下 express 包的 package.json 文件,位于 node_modules/express/package.json 内容
$ ll express
total 144
drwxr-xr-x  4 root root   4096 6月  25 12:08 ./
drwxr-xr-x  4 root root   4096 6月  25 12:08 ../
-rw-r--r--  1 root root 109589 10月 26  1985 History.md
-rw-r--r--  1 root root    224 10月 26  1985 index.js
drwxr-xr-x  4 root root   4096 6月  25 12:08 lib/
-rw-r--r--  1 root root   1249 10月 26  1985 LICENSE
drwxr-xr-x 51 root root   4096 6月  25 12:08 node_modules/
-rw-r--r--  1 root root   3949 6月  25 12:08 package.json
-rw-r--r--  1 root root   4607 10月 26  1985 Readme.md


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 - 关键字

EventEmitter

回调函数

 
NodeJs中的文件处理方法,若不特定指明,通常都是异步的
异步 I/O 操作在完成时都会发送一个事件到事件队列
一个 net.Server 对象会在每次有新连接时触发一个事件, 
一个 fs.readStream 对象会在文件被打开的时候触发一个事件。 
所有这些产生事件的对象都是 events.EventEmitter 的实例。

//最后一个输出
setTimeout(function () {

    let fs = require("fs");
    let data = fs.readFileSync('/opt/tmp/text.log');
    console.log(data.toString());
},1000);

//第二个输出
var fs = require("fs");
fs.readFile('/opt/tmp/text2.log', function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
});

//第一个输出
console.log("程序执行结束!");

EventEmitter

 
// 引入 events.js 模块
let events = require('events');

// 创建 eventEmitter 对象
let eventEmitter = new events.EventEmitter();

setTimeout(function () {
    eventEmitter.emit('water');
},1000);

let waterHandler = function () {
    console.log('浇水....');
    eventEmitter.emit('flower');
};
eventEmitter.on('water', waterHandler);

eventEmitter.on('flower', function(){
    console.log('开花....。');
});

console.log("开始....");

node events.js

 
$ node events.js 
开始....
浇水....
开花....

nodejs web框架

yo安装

 
yarn add yo -D 
yarn add generator-express -D 
yarn add npm-check -D 

yo express

nodejs require用法

 

$ cat aa.js 
function aa(){
    let a = 1 ;

    let b = 2;
    let c = a + b;
    alert(c);
}

exports.aa = aa;
---------------------------------------
exports代表整个aa.js

$ cat app.js 
let a = require('./aa.js');
a.aa();

========================================
$ cat aa.js 
function aa(){
    let a = 1 ;

    let b = 2;
    let c = a + b;
    alert(c);
}
module.exports = aa;
---------------------------------------
$ cat app.js 
let a = require('./aa.js');
a();

JS Map

 
mkdir /tmp/test 
cd /tmp/test/
npm init 

$ cat map.js 
let kv = new Map();
kv.set("age","21");
kv.set("name","tan");
console.log(kv.get("name"));
console.log(kv.values());

//遍历值
kv.forEach(elem => {
  console.log(elem);
});

for(let [key, value] of kv.entries()){
    // console.log(value);
    console.log(key,":",value);
}

$ node map.js 
tan
[Map Iterator] { '21', 'tan' }
21
tan
age : 21
name : tan

参考