学习笔记——Node.js入门知识1

一、Chrome浏览器JS运行环境
  1. V8引擎负责解析和执行JavaScript代码
  2. 内置API(应用程序编程接口)是由运行环境提供的特殊接口,只能在所属的运行环境中被调用。
二、nodejs简介
  1. Node.js 是一个基于Chrome V8引擎的JavaScript运行环境。JS可以借助nodejs直接运行在电脑上。nodejs除了帮助我们编译js外,还可以读写电脑上的文件、连接数据库、充当web服务器。
  2. 浏览器是JavaScript的前端运行环境,Node.js是JavaScript的后端运行环境。Node.js中无法调用DOM和BOM等浏览器内置API。.
三、Node.js基础知识
  1. 在Node.js环境中执行JavaScript代码:在终端输入命令(node 要执行的js文件的路径).
  2. Windows的powershell或cmd终端一些快捷指令:tab快速补全路径;esc清空当前已输入的命令;cls清空终端。
  3. 环境变量(Windows系统中的变量)path:当我们在命令行窗口中打开一个文件时,或调用一个程序时,系统会首先在当前目录下寻找文件程序,如果找到了则直接打开,如果没有找到则会依次到环境变量path的路径中寻找,直到找到为止,如果没有找到会报错。 所以我们可以将一些经常需要访问的程序和文件的路径添加到path中,这样我们就可以在任意位置来访问这些文件和程序了。
  4. web服务器的主要任务是处理http请求。http请求有三步。
    • 第一步:DNS解析,建立TCP连接,然后发起http请求。当我们在地址栏中输入域名时,首先会将域名进行DNS解析,解析出远程服务器的ip地址,解析出ip地址后就会建立TCP连接,连接建立好后会发送http请求。
    • 第二步:服务端接受http请求后进行处理并返回数据。
    • 第三步:客户端收到返回的数据,处理数据。如:渲染页面等。
  5. 创建Node.js应用:Node.js由三部分组成①引入required模块:使用require来载入Node.js模块②创建服务器③接受请求和响应请求。
  6. npm使用:
npm install express(模块名) //本地安装
npm install express(模块名) //去全局安装 
npm list -g //查看所有全局安装模块
npm list grunt //查看某个模板的版本号
npm uninstall 模块名//卸载Node.js模块
npm update 模块名//更新模块
npm search 模块名//搜索模块
npm init//创建模块

7.package.json文件:它位于模块的目录下,用于定义包的属性。package.json文件包含name、version、description(包的描述)、homepage(包的官网url)、author(包的作者名称)等属性。

四、Node.js模块
  1. 模块化:解决复杂问题时,自顶向下逐层把系统划分为若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元。
  2. Node.js中模块的分类:①内置模块(由Node.js官方提供的模块)②自定义模块(用户创建的每个js模块,都是自定义模块)③第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需下载)
  3. 加载模块:使用require()方法,可以加载需要的内置模块、用户自定义模块、第三方模块进行使用。使用require()方法加载其他模块时,会执行被加载模块中的代码。再加载用户自定义模块时,可以省略.js后缀名。
  4. 模块作用域:和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域。
  5. module对象:在每个自定义模块中都有一个module对象,它里面存储了和当前模块相关的信息。module.exports对象,在自定义模块中,可以使用该对象将模块内的成员共享出去,供外界使用,外界用require()方法导入自定义模块时,得到的是module.exports所指的对象(默认为空对象)。exports对象和module.exports指向同一个对象,最终共享的结果,还是以module.exports指向的对象为准。时刻谨记:require()导入模块时,得到的永远是module.exports指向的对象。
  6. Node.js遵循了CommonJS模块化规范,CommenJS规定了模块的特性和各模块之前如何相互依赖。
  7. Node.js中第三方模块又叫包,包是由第三方个人或团队开发出来的,免费供所有人使用。包是基于内置模块封装出来的,提供了更高级、更方便的API,极大地提高了开发效率。
五、fs文件系统模块
  1. fs模块是Node.js官方提供的、用来操作文件的模块。它提供了一系列方法和属性,用来满足用户对文件的操作需求。
  2. 在JavaScript代码中使用fs模块来操作文件,则需要require()来导入它
   const fs=require('fs');
  1. fs.readFile()方法:可以读取指定文件中的内容。fs.writeFile()方法:可以将内容写入文件中。
 fs.readFile(path,options,callback);
 //参数一:必选参数,字符串,表示文件的路径
 //参数二:可选参数,表示以什么编码格式来读取文件。
 //参数三:必选参数,回调函数,通过回调函数获取读取结果
const fs=require('fs');
fs.readFile('1.txt','utf-8',function(err,dataStr){
    //如果读取成功,则err的值为null
    //如果读取失败,则err的值为错误对象,dataStr的值为undefined
     if(err==null){
         return console.log("文件读取成功"+dataStr);
     }else{
         return console.log("文件读取失败"+err.message);
     }
})
  1. 练习:考试成绩管理:将小红=99 小明=88等数据改为小红:99 小明:88,并且每个数据之间换行。实现步骤①导入需要的fs文件系统模块②使用fs.readFile()方法,读取成绩文件③判断文件是否读取失败④文件读取成功后,处理成绩数据⑤将处理完的成绩数据,调用fs.writeFile()方法,写入新文件中。
const fs=require('fs');
fs.readFile('1.txt','utf-8',function(err,dataStr){
    //如果读取成功,则err的值为null
    //如果读取失败,则err的值为true,dataStr的值为undefined
     if(err){
        return console.log("文件读取失败"+err.message);
     }else{
        //读取成绩后,先把成绩的数据按照空格进行分割
        const a=dataStr.split(' ');
        //循环分割后的数组,对每一项数据,进行字符串的替换操作
        const arr=[];
        a.forEach(function(item){
            arr.push(item.replace('=',':'));
            //push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。
        })

        //把新的数组中的每一项进行合并,得到一个新的字符串。
        const newarr=arr.join('\r\n');
        //join() 方法用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的。
        console.log(newarr);
        fs.writeFile('1.txt',newarr,function(err){
            if(err){
                return console.log("写入文件失败!"+err.message);
            }else{
                return console.log("成绩写入成功");
            }
        })
     }
})
  1. 路径动态拼接问题:在使用fs模块操作文件时,如果提供的路径是以./和…/开头的相对路径时,很容易出现路径的动态拼接错误问题,代码在运行时,会以执行node命令时所处的目录,动态拼接出被操作文件的完整路径。可以直接提供一个完整的路径,但绝对路径的可移植性差,所以一般也不使用。__dirname表示当前文件所处的目录,所以可以使用__dirname+'相对路径’来解决路径动态拼接问题。
六、path路径模块
  1. path是Node.js官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理需求。
  2. path.join()方法:用来将多个路径片段拼接成一个完整的路径字符串。path.basename()方法:获取路径中的最后一部分,用来从路径字符串中,将文件名解析出来。path.extname()方法:用来获取路径中的扩展名部分。
const path=require('path');
const pathStr=path.join('/a','/b/c','../','./d','e');
//../会抵消掉前面的一个路径
console.log(pathStr);
const pathStr2=path.join(__dirname,'1.txt');
console.log(pathStr2);
const path1='/a/b/c/index.html';
var name=path.basename(path1);
console.log(name);//输出index.html
var name1=path.basename(path1,'.html');
console.log(name1);//输出index
var name2=path.extname(path1);
console.log(name2);
  1. 练习:将index.html文件拆分成三个文件,分别是index.css、index.js和index.html,并且将拆分出来的3个文件,存放到目录中。实现步骤①创建两个正则表达式,分别用来匹配<style>和<script>标签②使用fs模块,读取需要处理的html文件③自定义resolveCSS方法,来写入index.css样式文件④自定义resolveJS方法,来写入index.js文件⑤自定义resolveHTML方法,来写入index.html文件。注意:①fs.writeFile()方法只能用来创建文件,不能用来创建路径②重复调用fs.writeFile()写入同一个文件,新写入的内容会覆盖之前的旧内容。
const fs = require('fs');
const path = require('path');
//定义正则表达式,分别匹配<style></style>和<script></script>标签
const regstyle = /<style>[\s\S]*<\/style>/;
const regscript = /<script>[\s\S]*<\/script>/;
//调用fs.readFile()方法读取文件
fs.readFile(path.join(__dirname, 'Untitled-5.html'), 'utf-8', function (err, dataStr) {
    if (err) {
        return console.log('读取文件失败' + err.message);
    } else {
        resolveCSS(dataStr);
        resolveJS(dataStr);
        resolveHTML(dataStr);
    }
});
//处理CSS样式
function resolveCSS(htmlStr) {
    //第一步:使用正则提取需要的内容,exec()方法用于检索字符串中的正则表达式的匹配
    const css1 = regstyle.exec(htmlStr);
    //第二步:将提取出来的样式字符串进行替换,删去<style>标签
    const newcss = css1[0].replace('<style>', '').replace('</style>', '');
    //第三步:调用fs.writeFile()方法,将提取的样式存储到目录下的index.css文件中
    fs.writeFile(path.join(__dirname, '/clock/index.css'), newcss, function (err) {
        if (err) {
            return console.log('写入CSS样式失败' + err.message);
        } else {
            console.log('写入样式文件成功');
        }
    })
}
//处理JS脚本
function resolveJS(htmlStr) {
    //第一步:使用正则提取需要的内容,exec()方法用于检索字符串中的正则表达式的匹配
    const js1 = regscript.exec(htmlStr);
    //第二步:将提取出来的样式字符串进行替换,删去<style>标签
    const newjs = js1[0].replace('<script>', '').replace('</script>', '');
    //第三步:调用fs.writeFile()方法,将提取的样式存储到目录下的index.css文件中
    fs.writeFile(path.join(__dirname, '/clock/index.js'), newjs, function (err) {
        if (err) {
            return console.log('写入js文件失败' + err.message);
        } else {
            console.log('写入js文件成功');
        }
    })
}
//处理HTML文件
function resolveHTML(htmlStr){
    //调用replace方法将内嵌的style和scrip标签,替换为外联的link和script标签
    const newhtml=htmlStr.replace(regstyle,'<link rel="stylesheet",href="./index.css"/>').replace(regscript,'<script src="./index.js"></script>');
    //将替换后的字符串写入index.html文件
    fs.writeFile(path.join(__dirname,'/clock/index.html'),newhtml,function(err){
        if(err){
            return console.log('写入html文件失败'+err.message);
        }else{
            console.log('写入成功');
        }
    })
}
七、http模块
  1. http模块是Node.js官方提供的、用来创建web服务器的模块。在Node.js中,我们不需要使用Apache等这些第三方web服务器软件,而是通过http模块,通过代码手写一个简单的服务器软件从而对外提供web服务。通过http模块提供的http.createServer()方法,就能方便把一台普通的电脑,变成一台web服务器,从而对外提供web资源服务。
  2. 创建web服务器的基本步骤:①导入http模块②创建web服务器实例③为web服务器实例绑定request事件,监听客户端的需求④启动服务器。
const http=require('http');
const server=http.createServer();
//为服务器实例绑定request事件,监听客户端的请求
server.on('request',function(req,res){
    console.log('Someone visit our web server')
})
//启动服务器
server.listen(8080,function(){
    console.log('server running at http://127.0.0.1:8080')
})
  1. req是请求对象,它包含了与客户端相关的数据和属性。只要服务器接收到了客户端请求,就会调用通过server.on()为服务器绑定的request事件处理函数。如果想在事件处理函数中访问与客户端相关的数据或属性,可以使用如下方式:
server.on('request',(req,res)=>{
    //req是请求对象,它包含了与客户端相关的数据和属性
    //req.url是客户端请求的URL地址
    //req.method是客户端的method请求类型
    const url=req.url;
    const method=req.method;
    const str='Your request url is '+url+'',and request method is '+method;
    console.log(str);
    //调用res.end()方法向客户端响应一些内容
    res.end(str);
})
  1. res是响应对象,在服务器的request事件处理函数中,如果要访问与服务器相关的数据或属性,可以使用如上方式:
  2. 解决中文乱码问题:调用res.setHeader()方法,设置Content-Type响应头。
   res.setHeader('Content-Type','text/html;charset=utf-8');
  1. 根据不同的url响应不同的HTML内容:实现步骤①获取请求的URL地址②设置默认的响应内容为404 Not Found③判断用户请求是否为/或index.html首页④判断用户请求是否为/about.html关于页面⑤设置Content-Type响应头,防止中文乱码⑥使用res.end()方法吧内容响应给客户端。
const http=require('http');
const server=http.createServer();
server.on('request',function(req,res){
    const url=req.url;
    let content='<h1>404 Not Found</h1>';
    if(url=='/'||url=='index.html'){
        content='<h1>首页</h1>';
    }else if(url=='about.html'){
        content='<h1>关于页面</h1>';
    }
    res.setHeader('Content-Type','text/html;charset=utf-8');
    res.end(content);
})
server.listen(80,()=>{
    console.log('server running at http://127.0.0.1');
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值