nodejs入门
nodejs概念
Node.js,是一个可以让 JavaScript 运行在服务器端的运行环境。它可以让 JavaScript 脱离浏览器的束缚,就像运行 Python、Perl、PHP、Ruby 程序一样,我们可以用 Node.js 轻松地进行服务器端应用开发,Python、Perl、PHP、Ruby 能做的事情,Node.js 几乎都能做,而且可以做得更好。
nodejs能做什么
- 具有复杂逻辑的网站
- 基于社交网络的大规模 Web 应用
- Web Socket 服务器
- TCP/UDP 套接字应用程序
- 命令行工具
- 交互式终端程序
- 带有图形用户界面的本地应用程序
- 单元测试工具
- 客户端 JavaScript 编译器
CommonJs模块规范
CommonJs是一个模块规范,而nodeJs是一个环境,是一个具体的实现
在nodejs中每一个js文件就是一个模块,每一个模块都有自己的命名,不会互相干扰,如果在一个html中引入两个js,这两个js中都有相同的命名,这个就会报错,但是在nodejs中就不会报错
概念
Node.js 是目前 CommonJS 规范最热门的一个实现,它基于 CommonJS 的 Modules/1.0 规范实现了 Node.js 的模块,同时随着 CommonJS 规范的更新,Node.js 也在不断跟进。由于目前 CommonJS 大部分规范还在起草阶段,Node.js 已经率先实现了一些功能,并将其反馈给 CommonJS 规范制定组织,但 Node.js 并不完全遵循 CommonJS 规范。这是所有规范制定者都会遇到的尴尬局面,因为规范的制定总是滞后于技术的发展。
特点
- 所有代码运行在当前模块作用域中,不会污染全局作用域
- 模块同步加载,根据代码中出现的顺序依次加载
- 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。
用法
引入模块
//引入foo函数,用一个变量接收
//如果引入当前项目的模块,必须在路径前加上./或者../
//如果引入第三方或者官方模块,直接写模块名
const cs2 = require("指定导入模块的路径");
//引入解构函数
//导入多个模块可以用解构的方法
const {fn,fn1,fn2} = require("./index1");
导出模块
//导出模块中foo函数
module.exports.foo = foo;
//对象引入多个函数,但是不能和上面的一起用不然会覆盖上面的导出模块
module.exports = {
fn:fn,fn1:fn1,fn2:fn2
//如果变量和值相同的话可以直接写变量名
//fn,fn1,fn2
}
//可以直接用exports导出,但是不能用对象导出多个函数,会报错
//exports是module.exports默认对象的引用而已,不能直接给exports复制,否则它将不具备导出模块的功能
exports.f4 = f4;
npm常用命令
概念
NPM,英文全称 Node Package Manger,翻译成中文就是 Node 的包管理工具。因为我们在使用 Node.js 进行开发时,会用到很多别人写的 JavaScript 代码。如果我们要使别人写的某个包,每次都根据名称搜索一下官方网站,下载代码,解压,再使用,非常繁琐。于是一个集中管理的工具应运而生:大家都把自己开发的模块打包后放到 NPM 官网上,如果要使用,直接通过 NPM 安装就可以直接用,不用管代码存在哪,应该从哪下载。更重要的是,如果我们要使用模块 A,而模块 A 又依赖于模块 B,模块 B 又依赖于模块 X 和模块 Y,NPM 可以根据依赖关系,把所有依赖的包都下载下来并管理起来。否则,靠我们自己手动管理,肯定既麻烦又容易出错。
常用命令
初始化项目
npm init
设置淘宝镜像
npm config set registry=https://registry.npm.taobao.org
本地安装
npm install
把下载的东西放在dependencies里面–save
npm i lodash --save
全局安装
npm install -g
卸载安装的
npm c
NOdeJs内置模块
global:
-
console
-
__dirname
//当前文件所在目录的完整路径 console.log("dirname",__dirname);
-
__filename
//当前文件的完整路劲 console.log("filename",__filename);
-
os
//获取当前计算机的cpu信息 const os = require("os"); console.log("cpus:",os);
-
module
path:路径
const path = require("path");
-
basename
//获取路劲中最后一级的路劲名称 console.log("basename:",path.basename("/a/b/c/d/e.js")); //e.js console.log("basename:",path.basename("/a/b/c/d/e")); // e
-
dirname
//获取最后一级路劲父目录 console.log("dirname:",path.dirname("/a/b/c/d/e/f.js")); ///a/b/c/d/e
-
extname
//获取文件扩展名 console.log("extname:",path.extname("/a/b/c/d/e/f.js")); //.js
-
join
//将多级路径连接成完整路径 console.log("join:",path.join("/a","/b","/c","/d")); // \a\b\c\d console.log("join:",path.join("/a","/b","/c","../d")); //\a\b\d
fs:文件的写入
**IO操作和磁盘打操作:input onput **
加了Sync的就是同步方法,不加Sync的就是异步方法
//引入fs
const fs = require("fs");
-
writeFile(异步)
创建一个文件并写入内容,如果里面有这个文件,就会覆盖,没有这个文件就新建一个
//创建一个文件,在当前文件之下,如果你输入的地址不对,他就会报错 fs.writeFile("./1.txt","啊啊啊,大傻逼",function(err){ if(err){ console.log(err); return; } console.log("文件写入成功"); })
-
appendFile
在创建的文件里面新加内容
//在创建的文件里面加入内容 fs.appendFile("./1.txt","当然不是啦",function(err){ if(err){ console.log(err); return; } console.log("文件再次写入成功"); })
-
writeFileSync
//写文件(同步) fs.writeFileSync("./2.txt", "你好啊,小朋友");
-
readFile
//读文件(异步) fs.readFile("./1.txt", function (err, data) { if (err) { console.log(err); return; } console.log("data:", data.toString()); });
-
readFileSync
-
copyFile
复制文件
-
copyFileSync
-
mkdir
异步创建目录
-
mkdirSync
-
rm
删除文件和目录
url
-
new URL()
//创建一个地址 let url = new URL("http://192.168.1.100:8080/a/b/c?name=eee&age=18#hash");
-
protocol
console.log("protocol:",url.protocol); //protocol: http:
-
hostname
console.log("pathname:",url.pathname); //hostname: 192.168.1.100
-
port
console.log("port:",url.port); //port: 8080
-
pathname
console.log("pathname:",url.pathname); //pathname: /a/b/c
-
search
console.log("search:",url.search); //search: ?name=eee&age=18
-
hash
console.log("hash:",url.hash); //hash: #hash
-
searchParams
console.log("searchParams:",url.searchParams); //searchParams: URLSearchParams { 'name' => 'eee', 'age' => '18' }
-
new URLSearchParams()
//获取一个URLSearchParams对象 let searchParams = new URLSearchParams(url.search); console.log("获取数据",url.searchParams); //获取数据 URLSearchParams { 'name' => 'eee', 'age' => '18' }
-
set()
//修改或添加属性 searchParams.set("name","zzz"); searchParams.set("gender","man"); console.log("添加或修改的属性",searchParams); //添加或修改的属性 URLSearchParams { 'name' => 'zzz', 'age' => '18', 'gender' =man}
-
delete()
//删除指定的属性 searchParams.delete("age");
-
toString()
//将查询参数对象转换成查询字符串 console.log("转换成字符串",searchParams.toString()); //转换成字符串 name=zzz&gender=man
-
http
- createServer
- lister
- request
- respose
const http = require('http');
//创建服务器
//req,res:req请求,res响应
let server = http.createServer(function(req,res){
console.log("服务器处理用户的请求");
//也可以在write里面写html代码
// res.write("hello word1111111111");
res.write(
`
<html>
<head>
<meta charset="utf-8">
<title>node.js</title>
</head>
<body>
<h1>你好,大院中</h1>
</body>
</html>
`
)
res.end();
});
//启动服务器并打开监听端口
server.listen(3000);
console.log("服务器启动成功");
用fs导入html文件输出
const http = require('http');
const fs = require("fs");
const path = require('path');
//创建服务器
//req,res:req请求,res响应
let server = http.createServer(function(req,res){
console.log("服务器处理用户的请求");
console.log(req.url);
let url = req.url;
if(url == "/"){
url = "index.html"
}
//用fs导入
fs.readFile(path.join('./public',url),function(err,data){
if(err){
console.log(err);
res.end();
return;
}
res.write(data);
res.end();
})
});
//启动服务器并打开监听端口
server.listen(3000);
console.log("服务器启动成功");