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_PATH/.bin:$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"
npmjs.com
通常npm能安装的JS包,可以在下面的网址上找到其使用说明 https://www.npmjs.com/
事件驱动
nodejs是单线程,每次的web请求交由事件循环处理, 事件本身处理的内容是异步的,不会占用这个循环多少时间,因此效率不低。
事件循环
Node.js 是单进程单线程应用程序 异步..支持回调函数 事件机制用观察者模式实现 单线程类似进入一个while(true)的事件循环,直到通知完所有事件观察者才退出, 每个异步事件都有一个事件观察者,如果有事件发生就会通知该事件观察者(调用该回调函数).
观察者模式
定义一种一对多的依赖关系;被观察者发生变化时,会通知所有的观察者 每个被观察者对应的方法有,添加/删除/通知 观察者
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 位于模块的目录下,用于定义包的属性。 接下来让我们来看下 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 - 关键字
回调函数
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 开始.... 浇水.... 开花....
yo安装
yarn add yo -D yarn add generator-express -D yarn add npm-check -D yo express
$ 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();
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