Node.js入门
Node.js
-
基于 Chrome V8 引擎的 JavaScript 运行环境。
-
事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
-
Node.js 的包管理器 npm,是全球最大的开源库生态系统。
-
Node.js 可以解析JS代码(没有浏览器安全级别的限制)提供很多系统级别的API,如:
- 文件的读写
- 进程的管理
- 网络通信
- ……
准备工作
方式一:安装node.js
【推荐使用方法二安装】
官网下载地址
方式二:nvm——安装和维护多个Node.js版本
- 方法一:github——终端利用指令下载
- 方法二:github——下载安装包下载
windows 配置
- 配置环境变量:
NVM_HOME: D:\program_code\nvm
NVM_SYMLINK: D:\program_code\nodejs
把配置好的两个环境变量两边加上百分号,用分号隔开然后加入到PATH中;%NVM_HOME%;%NVM_SYMLINK%;
- 添加淘宝镜像 加速
在nvm安装路径下的setting.txt文件中,添加:node_mirror: https://npm.taobao.org/mirrors/node/ npm_mirror: https://npm.taobao.org/mirrors/npm/
mac配置
-
环境变量配置(参考官网)
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
-
配置加速路径 (在.bash_profile中)
export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node
使用方法:
- 查看当前node版本:
nvm ls-remote
- 安装某一版本node:
nvm install 版本号
nvm install 8.0.0
- 安装最新的lts版本:nvm install --lts
- 安装最新的current版本:nvm install node
- 查看已经安装的版本:nvm ls
- 查看当前使用node版本:node -v
- 使用某一版本:nvm use 版本号
命令行
- 使用
$ node
进入命令行 - 输入
process
查看可以使用的属性和方法
-
在浏览器和node命令行中运行代码
function add(x, y){
console.log(x+y);
}
add(3, 4) -
在浏览器和node命令行里调用 window, process 两个对象
执行.js文件
1、编写 index.js 文件
console.log(‘hello’);
function add(x,y) {
console.log(x+y);
}
add(6,7);
2、node index.js
执行代码
3、安装nodemon, 实时侦测文件的变化
-
安装nodemon:
npm install nodemon -g
(-g:全局范围内安装,这样任何目录下都可以使用npm命令) -
安装使用淘宝镜像【npm.taobao.org】
- 使用我们定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
- 使用cnpm
cnpm install nodemon -g
- 使用我们定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:
-
nodemon index.js
实时侦测出文件的变化 -
使用不同版本的Node.js
nvm ls nvm run v6.11.2
- 可以使用配置文件指定版本号:
- 在.nvmrc文件中输入版本号
- 终端输入:
nvm use
- 可以使用配置文件指定版本号:
-
创建一个.nvmrc 版本文件, 文件内容为:8.4.0
nvm run node –version cat .nvmrc nvm use
CommonJS
- JS开发规范:CommonJS 官方文档
- 模块分为三大类:
模块/包——提供各种功能 官方文档
- 【npm初始化】
-
引入内置的js模块/包
const os = require('os') console.log(os.hostname())
-
引入第三方模块/包
下载安装request包:npm install request -gconst request = require('request') request({ url: 'https://api.douban.com/v2/movie/top250', json: true }, (error, response, body) => { console.log(JSON.stringify(body, null, 2)); })
-
引入自定义的模块/包
【创建】src文件夹,其下创建greeting.jsmodule.exports.hello = hello
const hello = () => { console.log('hello ~'); } module.exports.hello = hello
【调用】 路径:
./src/greeting.js
const greeting = require('./src/greeting.js') greeting.hello()
【npm】
- 查询包的版本信息 npm info 包名
- 查询源:
nrm ls
- 测试源的速度:
nrm test
- 切换源:
nrm use
- package.json中的配置说明
- “^1.8.3” 表示1固定不变的最新版本
- “~1.8.3” 表示1.8不变的最新版本
- “*” 表示当前最新版本
使用入门
创建第一个Web服务器
URL
-
url.parse(urlString[, parseQueryString[, slashesDenoteHost]])
第二个参数表示是否解析query
第三个参数表示是否解析host -
url.format(urlObject) : 将url对象信息解析为url,与第一个操作相反
-
url.resolve(from, to) : 将两段url变成一个完整的url
Query String
- querystring.stringify(obj[, sep[, eq[, options]]]) —— 用于解析和格式化 URL 查询字符串:JSON对象转为字符串
-
querystring.parse(str[, sep[, eq[, options]]])——解析字符串
-
querystring.escape(str) —— 将字符串转化为浏览器能够识别的编码
提供给querystring.stringify()使用的,通常不直接使用,之所以对外开放,是为了在需要时可以通过querystring.escape赋值一个函数来重写编程的实现 -
querystring.unescape(str) —— 在给定的 str 上执行 URL 百分比编码字符的解码
unescape() 方法由 querystring.parse() 使用,通常不会被直接地使用。 它的导出主要是为了允许应用程序代码在需要时通过将 querystring.unescape 赋值给替代函数来提供替换的解码实现。
HTTP
node-get()方法——http爬虫
const https = require('https');
https.get('https://encrypted.google.com/', (res) => {
console.log('状态码:', res.statusCode);
console.log('请求头:', res.headers);
res.on('data', (d) => {
process.stdout.write(d);
});
}).on('error', (e) => {
console.error(e);
});
- http/https get方法 —— https.get(url[, options][, callback])
var http = require('http')
var https = require('https')
var url = 'https://www.lagou.com/'
https.get(url, function(res){
var html = ''
res.on('data', function(data){
html += data
})
res.on('end', function(){
var result = filterMenu(html)
printMenu(result)
})
res.on('error', function(err){
console.log(err)
})
})
- cheerio是jquery核心功能的一个快速灵活而又简洁的实现,主要是为了用在服务器端操作DOM
var cheerio = require('cheerio')
function filterMenu(html) {
var $ = cheerio.load(html)
var menu = $('.menu_main')
var menuData = []
menu.each(function(index, value){
var menuTitle = $(value).find('h2').text()
var menuLists = $(value).find('a')
var menuList = []
menuLists.each(function(index, value){
menuList.push($(value).text())
})
menuData.push({
menuTitle: menuTitle,
menuList: menuList
})
})
return menuData;
}
function printMenu(menu) {
menu.forEach(function(value){
console.log(value.menuTitle + '\n')
value.menuList.forEach(function(value){
console.log(value)
})
})
}
http-request——get获取异步数据
- https.request(url[, options][, callback])
const https = require('https');
const options = {
hostname: 'encrypted.google.com',
port: 443,
path: '/',
method: 'GET'
};
const req = https.request(options, (res) => {
console.log('状态码:', res.statusCode);
console.log('请求头:', res.headers);
res.on('data', (d) => {
process.stdout.write(d);
});
});
req.on('error', (e) => {
console.error(e);
});
req.end();
- 使用 URL 作为 options 的示例:
const options = new URL('https://abc:xyz@example.com');
const req = https.request(options, (res) => {
// ...
});
nodejs request——post方法提交表单
事件
const EventEmitter = require('events')
class Player extends EventEmitter {}
var player = new Player()
player.once('play', (track) => {
console.log(`正在播放:《${track}》`)
})
player.emit('play', '精绝古城')
player.emit('play', '黄皮子坟')
文件系统
-
得到文件与目录的信息:stat
const fs = require('fs') fs.stat('hello.js', (error, stats) =>{ if(error){ console.log(error) } else { console.log(stats) console.log(`文件:${stats.isFile()}`) console.log(`目录:${stats.isDirectory()}`) } })
-
创建一个目录:mkdir
const fs = require('fs') fs.mkdir('logs', (error) => { if(error){ console.log(error) } else { console.log('成功创建目录:logs') } })
-
创建文件并写入内容:writeFile,appendFile
const fs = require('fs') fs.writeFile('logs/hello.log', '您好 ~ \n', (error) => { if(error) { console.log(error) } else { console.log('成功写入文件') } }) fs.appendFile('logs/hello.log', 'hello ~ \n', (error) => { if(error) { console.log(error) } else { console.log('成功写入文件') } })
-
读取文件的内容:readFile
const fs = require('fs') fs.readFile('logs/hello.log', 'utf8', (error, data) =>{ if (error) { console.log(error) } else { console.log(data) } })
-
列出目录的东西:readdir
const fs = require('fs') fs.readdir('logs', (error, files) => { if (error) { console.log(error) } else { console.log(files) }
-
重命名目录或文件:rename
const fs = require('fs') fs.rename('logs/hello.log', 'logs/greeting.log', (error) =>{ if (error) { console.log(error) } else { console.log('重命名成功') } })
-
删除目录与文件:rmdir,unlink
const fs = require('fs') fs.readdirSync('logs').map((file) => { fs.unlink(`logs/${file}`, (error) => { if (error) { console.log(error) } else { console.log(`成功的删除了文件: ${file}`) } }) }) fs.rmdir('logs', (error) =>{ if (error) { console.log(error) } else { console.log('成功的删除了目录:logs') } })