创建应用服务
web开发
接口开发
客户端应用工具,react、vue、gulp、webpack脚手架
导出 module.exports
导入 require
// commonjs规范 == 只能在nodejs中使用,不可以浏览器中使用 cmd/amd/es6
// 导出 exports module.exports
// 区别:
// 共同点:导出模块
// 差别:module.exports它可以导出对象,而exports不可以
// exports = module.exports 引用 原型指向
// 导入
// require(路径)
// 导入一个内置的模块,os模块,使用一个变量接受
/* const os = require('os')
console.log(os.hostname()); */
// 如果安装第3方法模块,第一步先查看一下当前项目中,有没有package.json文件,如果没有则初始化一下
// npm init -y
// npm i -S lodash
/* const _ = require('lodash')
// 分割数组
console.log(_.chunk(['a', 'b', 'c', 'd'], 2)); */
// commonjs中,把一个文件当作一个模块
/* const fn = require('./userModule')
console.log(fn());
*/
/* const fn = require('user')
console.log(fn());
*/
tips:
若调用模块返回的是一个实例化对象,但是想用类,可以使用以下方法
const user = require('user'); //一个实例化对象
console.log(user.getName());
console.log(user.__proto__.constructor);//找到类
node app.js --port 8080;//对于node来说app.js --port 8080都是参数
可以通过process这个内置对象完成参数的获取
以下方法对命令参数处理
/* let args = {}
let arr = process.argv.slice(2);
arr.forEach((item, index) => {
// console.log(/^-/.test(item));
if (item.startsWith('--')) {
args[item.slice(2)] = arr[index + 1]
}
})
console.log(args); */
/* let args = process.argv.slice(2).reduce((p, c, index, arr) => {
if (c.startsWith('--')) {
p[c.slice(2)] = arr[index + 1]
}
return p
}, {});
console.log(args);
*/
const argv = require('minimist');//npm i -S minimist 需要安装库文件
console.log(argv(process.argv.slice(2)));
// 获取指定的环境变量
if (process.env.NODE_ENV == 'dev') {
// 开发环境
console.log('开发中');
} else if (process.env.NODE_ENV == 'test') {
console.log('测试中');
} else if (process.env.NODE_ENV == 'production') {
console.log('上线');
} else {
// throw new Error('有误')
console.log('我们的环境有 dev|test|production');
}
//===================================================
//package.json文件中修改
{
"name": "01_base",
"version": "1.0.0",
"description": "",
"main": "01_module.js",
"scripts": {
"dev": "cross-env NODE_ENV=dev node 03_env.js",
"test": "cross-env NODE_ENV=test node 03_env.js",
"build": "cross-env NODE_ENV=production node 03_env.js"
},
"keywords": [],
"author": "wuchen",
"license": "ISC",
"dependencies": {
"minimist": "^1.2.5"
},
"devDependencies": {
"cross-env": "^7.0.3"
}
}
//=============================
//用npm启动,例如
npm run dev
const os = require('os')
// 换行符
os.EOL //根据操作系统生成对应的换行符 window \r\n,linux下面 \n
// 查看cpu相关信息
os.cpus()
// 总内存大小 (单位 字节)
os.totalmem()
// 空余内存大小 (单位 字节)
os.freemem()
const path = require('path')
// 获取路径最后一部内容 一般用它来获取文件名称
path.basename('c:/a/b/c/d.html') // d.html
// 获取目录名,路径最后分隔符部分被忽略
path.dirname('c:/a/b/c/d.html') // c:/a/b/c
// 获取路径中文件扩展名
path.extname('c:/a/b/c/d.html') // .html
// 给定的路径连接在一起
path.join('/a', 'b', 'c') // /a/b/c
// 把相对地址转为绝对路径
path.resolve('/a', '../b')
// const url = require('url')
// let href = 'https://new.qq.com/omn/20210516/20210516A09D5P00.html?id=100#hash'
// 参数1:分析url地址
// 参数2:boolean true为query属性转为对象,false字符串
// 参数3:一般不用 boolean true时,在url地址没有写协议时,还可以获取主机名
// console.log(url.parse(href, true, true));
// console.log(url.parse(href, true));
/* const { pathname, query } = url.parse(href, true)
console.log(pathname, query); */
//============================================
// URL js内置
// let href = 'https://new.qq.com/omn/20210516/20210516A09D5P00.html?id=100&name=lisi#hash'
// getAll()
// let href = 'https://new.qq.com/omn/20210516/20210516A09D5P00.html?id=100&id=200&name=lisi#hash'
// 全部的get数据
let href = 'https://new.qq.com/omn/20210516/20210516A09D5P00.html?id=100&name=lisi#hash'
const url = new URL(href);
// console.log(url.searchParams);
// console.log(url.searchParams.get('id'));
// console.log(url.searchParams.get('name'));
// 获取query中相同名称的数据 以数组形返回
// console.log(url.searchParams.getAll('id'));
// 获取全部的get数据
// console.log(url.searchParams.entries());
for (let [key, value] of url.searchParams.entries()) {
console.log(key, value);
}
用于解析和格式化url的工具
const querystring = require('querystring')
// query字符串转为对象
querystring.parse('foo=bar&abc=xyz')
// 对象转为query字符串
querystring.stringify({ foo: 'bar',abc: 'xyz'})
const fs = require('fs')
let filepath = path.resolve('data/lisi.txt');
//文件操作
// 写入数据
fs.writeFile(文件路径,数据,err=>{})
// 读取文件中数据
fs.readFile(filepath , 'utf8’,(err,data)=>{})
// 检查文件或目录是否存在 返回true/false
fs.existsSync(path)
// 获取文件信息
fs.stat(filepath ,(err,stats)=>{
stats.isDirectory() // 是否是目录
stats.isFile() // 是否为文件
stats.size // 文件大小(以字节为单位)
})
// 删除文件
fs.unlink(filepath ,err=>{})
//=================================
// 目录操作
// 创建目录
fs.mkdir('./logs', { recursive: true }, (err) => {
console.log('done.')
})
// 删除目录
fs.rmdir('./logs', { recursive: true }, () => {
console.log('done.')
})
// 读取目录列表
fs.readdir(path, (err,data) => {
// data是一个数组,里面包含了当前路径下所有的文件和文件夹名称
})
//=======================
//删除文件的异步写法
delDir(dirpath, () => { })
function delDir(dirpath, cb) {
fs.stat(dirpath, (err, stat) => {
if (stat.isFile()) {
fs.unlink(dirpath, cb)
} else {
fs.readdir(dirpath, 'utf-8', (err, dirs) => {
if (dirs.length == 0) {
// 此目录是一个空目录
fs.rmdir(dirpath, cb)
} else {
// 读取的目录中的相对路径转为绝对路径
dirs = dirs.map(item => path.join(dirpath, item))
let index = 0;
function doneFn() {
if (++index == dirs.length) {
fs.rmdir(dirpath, cb)
}
}
dirs.forEach(dir => {
delDir(dir, doneFn)
})
}
})
}
})
}
类似于js中的抛发侦听时间
先订阅后发布
const EventEmitter = require('events')
const events = new EventEmitter();
// 订阅
events.on('上课了', arg => {
console.log('小明订阅:' + arg);
})
events.on('上课了', (arg) => {
console.log('小张订阅:' + arg);
})
##############
events.emit('上课了', '今天讲nodejs')
Web服务器一般指的是网站服务器,是指驻留因特网上某一台或N台计算机的程序,可以处理浏览器等Web客户端的请求并返回相应响应,目前最主流的三个Web服务器是Apache、 Nginx 、IIS、Tomcat。
服务器:IP地址、域名、端口、协议
// 成为一个http服务器
// 主机 + 协议(nodejs中的http模块[http协议]) + 端口号
// http事件处理
const http = require('http');
const {now} = require('./utils/date')
// 创建一个web服务器
const server = http.createServer()
// 监听事件 浏览端请求 request
// request 请求对象 用于获取浏览器请求 头和体
// response 服务器对浏览器的响应 行+头+体
server.on('request', (request, response) => {
// 当前的请求 uri
// console.log(request.url);
// 获取请求方法
// console.log(request.method);
// 请求头获取
// console.log(request.headers);
if (request.url !== '/favicon.ico') {
console.log(now());
console.log(request.headers['user-agent']);
}
// 响应头
// response.setHeader('Content-Type', 'text/plain;charset=utf-8')
// response.setHeader('Content-Type', 'text/html;charset=utf-8')
response.setHeader('Content-Type', 'application/json;charset=utf-8')
// 服务器给浏览器响应
// response.end('你好世界')
// response.end('<h3>你好世界</h3>')
response.end(JSON.stringify({ id: 1, name: '张三' }))
})
// 监听 端口
// 0.0.0.0 => 监听服务器中所有的网址请求
// 具体的ip 对应的此网卡的ip才能访问 10 200
// ifconfig => linux
server.listen(3000, '0.0.0.0', () => {
console.log('服务已启动 http://127.0.0.1:3000');
})