Node 简介
Node.js 是基于Chrome V8引擎的 JavaScript 运行环境。(控制台终端执行)
NPM 使用介绍:
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:
- 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
- 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
- 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
由于新版的nodejs已经集成了npm。同样可以通过输入 "npm -v" 来测试是否成功安装。
运行环境
① 浏览器是JavaScript的前端环境。
②Node.js 是JavaScrip的后端环境。
运用
- 基于Express框架(http://www.expressjs.com.cn/),可以快速构建Web应用。
-
基于Electron框架(https://electronjs.org/),可以构建跨平台的桌面应用。
-
基于restify框架(http://restify.com/),可以快速构建API接口。
-
读写操作数据库,创建实用命令行工具负责前端开发。
Node 三大模块(内置模块)
fs 文件系统模块 (操作文件)
//导入fs模块
const fs = require('fs');
//调用fs.redFile() 读取文件
//fs.readFile( path [,options], callback )
//参数1 读取文件路径
//参数2 读取编码格式,默认utf8
//参数3 回调函数,获取失败成功结果 err dataStr
fs.readFile('./flies/test.txt','utf8',function(err,dataStr){
if(err)
return console.log('读取文件失败'+err.message);
console.log('读取文件成功:'+dataStr);
});
//调用fs.writeFile() 写入文件(可自动创建文件,不可创建路径。新内容会覆盖旧内容)
//fs.writeFile( file,data[,options], callback )
//参数1 写入文件路径
//参数2 写入文件内容
//参数3 读取编码格式,默认utf8
//参数4 回调函数,获取失败成功结果 err
fs.writeFile('./flies/testW.txt','TEST_FS_WRITE','utf8',function(err){
if(err)
return console.log('写入文件失败'+err.message);
else
console.log('写入文件成功!');
});
//fs模块 路径动态拼接问题(相对路径)
//原因:代码运行时,会执行 node 命令时所在目录,动态拼接出被操作文件的完整路径
//处理:提供完整文件存储路径
path 路径模块(处理路径)
//导入path模块
const path = require('path');
var fPath = '/a/b/c/index.html';
//路径拼接
//path.join() 拼接多个路径成完整路径字符串
var pathStr = path.join('/a','/b/c','../','./d','e');
console.log(pathStr); //输出 \a\b\d\e ../会抵消前一个路径
var pathStr1 = path.join(__dirname,'/files/1.tex');
console.log(pathStr1); //输出 当前所在目录 \files\1.tex
//获取路径中的文件名
//path.basename( path [,ext] )
//参数1 表示文件路径
//参数2 表示文件扩展名
//返回 路径中最后一部分
var fullName = path.basename(fPath);
var namewithouExt = path.basename(fPath,'.html');
console.log('fullName:'+fullName);
console.log('namewithouExt:'+namewithouExt);
//获取文件扩展名
//path.extname(path)
//参数1 表示文件路径
//返回 路径中最后一部分
var extName = path.extname(fPath);
console.log('extName:'+extName);
综合案例:HTML 、CSS 、JS 的拆解
//导入模块
const fs = require('fs');
const path = require('path');
var fliePathStr = './flies/index.html'; //目标路径
//定义正则表达式,分配<style> <script> 标签
var regStyle = /<style>[\s\S]*<\/style>/; //匹配所有
var regScript =/<script>[\s\S]*<\/script>/; //匹配所有
//读写文件
fs.readFile(path.join(__dirname,fliePathStr),'utf8',function(err,dataStr){
if(err)
return console.log('读取文件失败:'+err.message);
//console.log('读取文件成功:'+dataStr);
//调用方法拆解css,js,html文件
resolvCSS(dataStr);
resolvJS(dataStr);
resolvHTML(dataStr);
});
//拆解CSS
function resolvCSS(htmlStr)
{
//正则表达式,提取内容
var tmpR = regStyle.exec(htmlStr);
//console.log(tmpR);
//替换 操作
if(tmpR.length>0)
{
var newCSS = tmpR[0].replace('<style>','').replace('</style>','');
//console.log(newCSS);
//写文件
fs.writeFile(path.join(__dirname,'./Clock/index.css'),newCSS,'utf8',function(err){
if(err)
return console.log('写入CSS文件失败'+err.message);
console.log('写入CSS文件成功');
});
}
}
//拆解JS
function resolvJS(htmlStr)
{
//正则表达式,提取内容
var tmpR = regScript.exec(htmlStr);
//console.log(tmpR);
//替换 操作
if(tmpR.length>0)
{
var newJS = tmpR[0].replace('<script>','').replace('</script>','');
//console.log(newCSS);
//写文件
fs.writeFile(path.join(__dirname,'./Clock/index.js'),newJS,'utf8',function(err){
if(err)
return console.log('写入JS文件失败'+err.message);
console.log('写入JS文件成功');
});
}
}
//拆解HTML
function resolvHTML(htmlStr)
{
var newHTML = htmlStr;
// <style> 和 <script> 替换为 外联的 <link> 和 <script> 表签
newHTML = newHTML.replace(regStyle,'<link rel="stylesheet" href="./index.css"/>');
newHTML= newHTML.replace(regScript,'<script src="./index.js"></script>');
//写文件
fs.writeFile(path.join(__dirname,'./Clock/index.html'),newHTML,'utf8',function(err){
if(err)
return console.log('写入HTML文件失败'+err.message);
console.log('写入HTML文件成功');
});
}
http模块( 创建Web服务器模块 )
在Node.js 中,不需要使用 IIS、Apache 等第三方Web服务器软件。
基于Node.js提供的 http模块,可以实现生成服务器软件,对外提供Web服务。
//导入http模块
const http = require('http');
//创建 Web 服务器实例
var server = http.createServer();
//为服务器实例绑定request 事件,监听客户端的请求
server.on('request',function(req,res){
//req请求对象(访问与 客户端 相关的数据或属性)
//req.url 客户端请求 URL 地址
//req.method 客户端 method 请求类型
var url = req.url;
var content = '<h1>404 Not found!</h1>';
//根据不同url响应对应html内容
if(url === '/' || url === '/index.html'){
//访问首页
content = '<h1>首页</h1>';
}
//res响应对象(访问与 服务器 相关的数据或属性)
//res.end 向客户端发送指定内容并结束这次请求处理
//解决 中文乱码 问题 设置响应头 Content-Type 为 text/html;charset=utf-8
res.setHeader('Content-Type','text/html;charset=utf-8');
var strInfo = 'WebServer 服务器正在被访问;URL地址:'+req.url+'; Method类型:'+req.method;
console.log(strInfo);
res.end(content);
});
//启动服务器
server.listen(8080,function(){
console.log('Server running at http://127.0.0.1:8080.');
});
项目部署案例:
//导入模块
const fs = require('fs');
const path = require('path');
const http = require('http');
//创建 Web 服务器实例
var server = http.createServer();
//为服务器实例绑定request 事件,监听客户端的请求
server.on('request',function(req,res){
var url = req.url;
//res.setHeader('Content-Type','text/html;charset=utf-8'); //会影响样式编码
var content = '<h1>404 Not found!</h1>';
//URL 映射为文件储存路径(路径优化)
//var urlPath = path.join(__dirname,url);
var urlPath = '';
if(url === '/')
urlPath = path.join(__dirname,'./Clock/index.html');
else
urlPath = path.join(__dirname,'./Clock',url);
//读取文件
fs.readFile(urlPath,'utf8',function(err,dataStr){
if(err)
return res.end(content);
res.end(dataStr);
});
});
//启动服务器
server.listen(8080,function(){
console.log('Server running at http://127.0.0.1:8080.');
});
Node 模块分类
- 内置模块(由Node.js官方提供,例如:fs、path、http等)
- 自定义模块(由用户创建的 js 文件)
- 第三方模块(由第三方提供,使用前需要下载)
使用 require() 方法加载模块。(自定义模块需要文件路径;加载模块时,会执行模块中代码)
模块作用域
自定义模块中定义的 变量、方法等成员,只能在当前模块内被访问。
- module对象:存储和当前模块有关属性。
- module.exports对象:将模块内成员共享,供外界使用。(require() 所指对象)
- exports对象:exports 与 module.exports 指向的是统一对象。
使用误区:
模块加载机制
模块在第一次加载后会被缓存。多次 requrie() 不会被多次执行。(优先从缓存中加载)