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"
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