2019-04-16

node(一)

标签(空格分隔): 前端笔记


const path = require('path');
const fs = require('fs');

//记住,今后只要涉及到路径片段的拼接,一定要使用path.join()方法
// __dirname 是运行js文件的那个目录文件夹
fs.readFile(path.join(__dirname,'./22.txt'),'utf-8',(err,data) => {
    if (err){
        console.log(err);
    } else {
        console.log(data);
    }
})

结论:今后在调用 fs 模块,操作文件的时候,如果要提供路径,一定不要使用相对路径。

js代码什么情况下必须加分号
如果一行代码,是以{ [ + - / 这5个符号中的任何一个开头,则应该在行首,添加一个分号

;[1,2,3].forEach(item=> {
    console.log(item);
})
  • 读取文件的方法
fs.readFile(__dirname + '/files/1.txt','utf-8',(err,data)=> {
    if (err) {
        return console.log("读取文件失败"+err.message);
    }else {
        console.log(data);
    }
})

  • 文件写入的方法
const fs = require('fs');
fs.writeFile('./files/2.txt','abcdd',(err)=> {
    if(err){
        console.log("写入文件失败!"+err.message);
    }else{
        console.log('写路文件成功!');
    }
})

  • 追加文件
const fs = require('fs');
fs,appendFile('./files/2.txt','4444',(err) => {
    if(err){
        return console.log('追加失败!'+err.message);
    }else{
        console.log('ok!');
    }
})

1、整个node.js课程学习目标

  1. 【基础概念】
  • 什么是node.js以及node.js的特点
  • node.js适合做什么
  • 什么是模块化、什么是Common.js模块化规范
  • 模块、包、npm、包加载机制
  • etc

  1. 【基本能力】
  • 掌握node.js中基本API的使用
  • 能够使用npm包管理
  • 能够使用ES6新语法
  • 能够使用node.js创建基本的Web服务器


  1. 【高阶能容】
  • 能够使用Express框架、结合mysql数据库实现后端网站
  • 把做好的网站部署到服务器中,供外网访问
  • 把做好的网站,使用https协议对外发布

注意:整个node.js学习阶段,概念类知识点较多,需要理解透彻!
总结:node.js整个课程阶段,最主要的学习目标,是为了能够使用node.js,结合JavaScript实现后端编程。


2、了解基本概念

2.1 语言和环境(平台)之间的关系

  1. 语言,是编写代码的语法规范;程序员遵循特定的语法规范,编写出来的代码,只是单纯的文本字符串而已,并不具备可执行的特点。

  2. 环境(平台),提供了执行代码的能力,如果程序员编写的代码想要成功执行,必须要特定的执行环境

  • 例如:JavaScript代码可以被浏览器中的JS解析引擎执行;
  • 所以,浏览器,就是一个JavaScript的执行环境,因为JavaScript代码可以在浏览器中被执行。
  • 我们即将要学习的node.js,就是另外一个JavaScript解析执行环境,所以,JavaScript代码,还可以运行在node.js中。

2.2 前端和后端

  1. 后端主要工作
  • 操作数据库
  • 对外暴露操作数据库的API接口
  1. 前后端写作开发

  2. 前端主要工作

  • 美化页面样式
  • 页面结构
  • 书写页面的业务逻辑
  • 使用Ajax调用后台接口

2.3 浏览器环境中的Javascript

  1. 诞生:上世纪90年代左右,网景liveScript、表单验证
  2. 一战:
  • 主角:微软和网景
  • 结果:微软IE胜出
  • 胜利的果实:ECMAScript语言标准的诞生
  1. 二战:
  • 主角:谷歌、火狐、IE
  • 结果:谷歌胜出
  • 胜利的果实:谷歌的V8引擎是最快的JS解析引擎
  1. 回顾:浏览器中JavaScript的组成部分
  • ECMAScript核心+DOM+BOM

2.4 NOde环境中的JavaScript

  1. 什么是node.js:就是JavaScript的服务器端运行环境,可以让程序员使用JavaScript来实现服务端的编程
  2. node.js中的JavaScript的组成部分
  • ECMAScript 核心 + 全局成员 + 核心API模块
  • 全局成员
  • 核心 API模块:就是node平台单独提供的一些api,这些api都是node平台所独有的
  1. 注意:node.js中没有BOM、DOM
  • 由于node服务器端运行环境中,没有浏览器和HTML的概念,所以,node中的javascript提出了DOM和BOM这两个对象模型,取而代之的,是全局成员和核心API模块。

2.5 ECMAScript规范,浏览器中的Js,node中的js之间的关系

  1. ECMAScript规范(标准):就是一本书,这本书中规定了语言的特性
  2. 浏览器中的js:
  • 浏览器中的js组成部分,ECMAScript核心 + DOM + BOM
  1. node中的js
  • node中的js组成部分:ECMAScript核心 + 全局成员 + 核心API成员

2.7 总结

  1. 什么是node.js(我们自己给它下个定义)

就是一个服务器端的JavaScript运行环境,可以让程序员,通过JavaScript做后台服务器编程开发。

  1. 学习node.js可以做什么
  • 像PHP一样,使用JavaScript编写符合规范的后端API接口或带后台功能的网站
  • 使用node.js开发一些实用的工具或包
  • 基于Socket技术,开发类似聊天室之类的即时通讯项目
  • 基于Electron环境,开发桌面软件
  • ect...

3、环境安装

3.1 LTS和Current版本的区别

  1. LTS:【推荐在企业中使用】,是长期稳定版的安装包,运行稳定、安全
  2. Current:【推荐学习或尝鲜去使用】,是最新特征版,这个安装包中有最新的node特性。

3.2 下载安装

官网:[node.js官网][1]
查看是否安装成功:

cmd ---- > node -v

3.3 查看node版本号

  1. 打开终端,在命令行输入命令node -v即可
  2. Tips:如何进入终端呢?
  • 【推荐】在任意目录的空白位置,先按住shift键不松开,然后在空白位置,鼠标右键档级,会出现一个右键菜单,选择在此处打开 powershell/cmd窗口
  • 【了解】使用快捷键windows徽标 + R打开运行面板,输入cmd后直接回车

3.4 path环境变量

  1. 什么是环境path环境变量
  • path环境变量的作用:能够让我们在终端中执行相关的命令,从而快速启动应用程序
  1. 系统环境变量和用户环境变量的区别
  • 用户环境变量:
  • 系统环境变量:
  1. 通过终端输入命令的形式,快速启动应用程序时,路径的查找规则
  • 先在当前运行终端命令的目录中查找,如果有则直接运行;
  • 如果当前目录中没有,则去全局的path环境变量中查找

4、node.js环境中执行js代码的两种方式

4.1 node 命令(推荐)

  1. 直接使用node要执行的js文件的路径来执行指定的的JS文件

小技巧:
1. 在终端中,使用的键盘的上键,可以快速定位到上一次执行的命令
2. 在终端中,使用键盘的tab键能够快速补全路径
3. windows系统上,在终端中输入cls可以清屏
4. 可以使用exit命令退出当前终端

创建一个js文件:
在文件的目录中打开终端:
node ./11.js

4.2 REPL环境-了解

  1. 如何进入REPL环境,打开任意终端,直接输入node并回车,就会进入到REPL环境中
  2. 如何离开REPL环境,按两次 ctrl + c 就能退出REPL环境
  3. REPL中,每个字母代表什么意思呢:
  • R:Read的意思,每当我们输入完毕代码之后,只要敲击回车,node环境就会读取用户输入的代码
  • E:Evalute的意思,表示把read进来的用户代码,调用类似于Eval的函数,去解析执行
  • P:Print输出的意思,把第二步中解析执行的结果,输出给用户
  • L:Loop循环的意思,表示当输出完毕之后,进入下一次REPL循环

5、ECMAScript 6常用的语法

5.1 let(变量)与const(常量)

  1. 之前定义变量,用var关键字,有如下主要特点:
  • 存在变量提升问题,降低js代码的可阅读性
  • 没有块级作用域,容易造成变量污染
  • 变量可以被多次重复定义
  1. let主要特征
  • 不存在变量提升问题,只有定义之后才能使用此变量
  • { }作用域,而且,在同一作用域中,无法重复定义
  1. const主要特征
  • 不存在变量提升问题,只有定义之后才能使用此变量
  • const定义的常量,无法被重新复制
  • 当定义常量的时候,必须定义且初始化,否则报语法错误
  • const定义的常量,也有块级作用域
console.log(a); //-->不报错,输出undefind
var a = 10;

// let也是用来定义变量的
console.log(a); //--> 报错,变量没有声明
let a = 10;、
/*------------------------*/
for(var i = 0;i < 3;i++ ){ }
console.log(i); //--> 输出为3 3,循环之后输出为3,var没有块级作用域

for(let i = 0;i<3;i++){ }
console.log(i); //--> 报错,let声明的变量具有块级作用域,只有在for循环中才可以访问到,在外部访问报错
/*------------------------*/
for(let i = 0;i<3;i++){ 
    // 由于 { }会对let产生作用域,所以每次循环,都创建了独立的 {} 的作用域,和上一次的循环,作用域各自独立
    console.log(i); //--> 输出为:1、2、3 每个for循环都是一个块级作用域,循环三次,创建三个块级作用域
}
/*------------------------*/
var a = 10 ;
var a = 20 ;
console.log(a); //--> 输出为20,var 可以重复声明一个变量
{
    let a = 10;
    let a = 20;
    console.log(a); //--> 报错,在同一作用域中,let定义的变量,无法被重新定义
}
var a = 30;
console.log(a); //--> 在不同作用域中,可以使用let定义相同的变量名
/*------------------------*/
const a;
console.log(a) //--> 报错,定义const常量时候,必须定义且赋值

5.2 变量的结构赋值(常用)

定义:所谓的结构赋值,就是把某个对象中的属性,当作变量,给解放出来,这样,今后就能够当作变量直接使用了。

  • 可以使用:为解放出来的变量重命名
//变量的结构赋值
const obj = {
    a: 10,
    name: 'zs'
}
//可以直接通过 = 为常量对象中的属性赋值,但是无法使用 = 为常量重新赋值
obj.a = 20;

console.log(obj);
/*--------------------------*/
const person = {
    name: 'zs',
    age: 22,
    gender: '男',
    address: '成都'
}
//传统做法
const name = person.name;
console.log(name);
const address = persobn.address;
console.log(address);
//结构赋值
const { name:username,address:address } = person //把对象的name属性和address属性的值取出来
console.log(name);
console.log(address);

5.3 箭头函数

  1. 语法
  • 定义普通的function函数
function show() {
    console.log('这是普通 function 定义的 show 方法');
}
  • 把方法定义为箭头函数(最完整的写法)
(形参列表) => {函数体代码}
  1. 箭头函数,本质上就是一个匿名

  2. 箭头函数的特性:箭头函数内部的this,永远和箭头函数外部的this保持一致

  3. 变体

  • 变体1:如果箭头函数,左侧的形参列表中,只有一个参数,则,左侧小括号可以省略
  • 变体2:如果右侧函数中,只有一行代码,则,右侧的 { } 可以省略
  • 变体3:如果箭头函数左侧只有一个形参,而且右侧只有一行代码,则两边的 () 和 { } 都可以省略
  1. 注意:如果我们省略了右侧函数体的 {} ,那么,默认会把右侧函数体中代码的执行结果,当作箭头函数的调用结果return 出去。
const show = (name)=> {
    console.log('my name is'+ name);
}
show('zs');

//箭头函数的自调用
;(()=> {
    console.log('my name is'+ name);
})();

//变体1(省略() )
const show = name=> {
    console.log('my name is'+ name);
}
//变体2 (省略 {})
const show = (name)=> console.log('my name is'+ name);
//变体3 (省略 ()和 {})
const show = name => console.log('my name is'+ name);



5.4 对象中定义方法和定义属性的便捷方式

const name = 'zs';
const age = 22;
const gender = '女';
const say = function(){
    console.log('say');
}

const person = {
    name,
    age,
    gender,
    say,
    show(){
        console.log(this);
    }
}

6、文件操作

6.1 文件读取

/*
* 使用 require 方法,导入fs模块
* fs模块的作用,就是来操作文件的
*/
const fs = require('fs');

/*
* 接收三个参数
* 参数1:【必选参数】字符串的文件路径,表示要读取哪个文件
* 参数2:【可选参数】字符串类型的编码格式,默认为null
* 参数3:【必选参数】回调函数
*       有两个参数 err 错误的结果  data 读取到的内容
*/
fs.readFile('./files/1.txt',(err,data)=> {
    // 如果读取成功,则 err 为 null,data 是成功之后的数据
    // 如果读取失败,则err 为一个错误对象,data 为undefined
    // err 是Error类型的一个对象,data 是一个二进制的数据,不过在展示的时候,为了方便展示,操作系统帮我们把二进制的 Buffer 转换为了十六进制的格式
    console.log(err); //--> null
    console.log(data); //--> <Buffer 61 62 63>
    /*---------------------------------*/
    
    console.log(data.toString()); 
});
/*---------------------------------*/
//提供了编码格式自动转换为二进制,没有提供编码格式则直接显示二进制
fs.readFile('./files/1.txt','utf-8',(err,data)=> {
     console.log(data); 
})
/*-----------------------------------------使用此方法*/
fs.readFile('./files/1.txt','utf-8',(err,data)=> {
    if (err) {
        return console.log("读取文件失败"+err.message);
    }else {
        console.log(data);
    }
})

6.2 文件写入

const fs = require('fs');
/*
*参数1:要把文件写路到哪个路径中
*参数2:要写入的内容
*参数3:字符集编码格式
*参数4:回调函数,只有一个参数err
* 如果文件存在,则会覆盖文件
*/
fs.writeFile('./files/2.txt','abcdd',(err)=> {
    if(err){
        console.log("写入文件失败!"+err.message);
    }else{
        console.log('写路文件成功!');
    }
})

6.3 文件追加

const fs = require('fs');

/*
*参数1:要追加的文件
*参数2:追加的内容
*参数3:字符集编码,默认为utf-8
*参数4:回调函数,参数为err
* 如果追加的文件不存在,就会创建这个文件
*/

fs,appendFile('./files/2.txt','4444',(err) => {
    if(err){
        return console.log('追加失败!'+err.message);
    }else{
        console.log('ok!');
    }
})

6.4 fs模块中路径操作问题(难点)

console.log(__dirname); //--> 打印出文件所在的目录 C:\Users\19254\Desktop\node
console.log(__filename); //--> 打印出文件所在的路径以及文件名称 C:\Users\19254\Desktop\node\11-fs.js

/*-------------------------------*/


6.5 读取文件信息

const fs = require('fs');

//读取文件信息
const fs = require('fs');
fs.stat(__dirname+'/22.txt','utf-8',(err,stats) => {
    if (err){
        console.log("读取文件失败!" + err.message);
    } else {
        //读取文件大小,单位是子节 byte(不能获取目录的大小)
        console.log(stats.size);
        //读取文件的创建时间
        console.log(stats.birthtime);
        //判断是否是一个文件
        console.log(stats.isFile());
        //判断是否是一个目录
        console.log(stats.isDirectory());
    }
})

6.6 读取指定目录中所有文件的名称

/*
* 第一个参数要复制的文件路径
* 第二个参数要存放的文件路径
* 第三个参数回调函数,参数是错误对象
* */
fs.copyFile(__dirname+'/22.txt',__dirname+'/22-copy.txt',(err) =>{
    if (err){
        console.log("复制文件失败!"+err.message);
    } else {
        console.log("复制成功!");
    }
});

7、路径操作

  • path.sep
const path = require('path');

/*
* 提供平台特定的路径片段分隔符
* windows 上是 '\'
* posix 上是 '/'
* */
console.log(path.sep); //--> \
  • path.basename(pathname [,ext])
const path = require('path');
const pathStr = "c:/a/b/c/1.html";
//返回最后文件名字以及后缀名
console.log(path.basename(pathStr)); //--> 1.html
//传第二个参数,就是文件的后缀名,输出的话就会忽略文件的后缀名
console.log(path.basename(pathStr,'.html')); // --> 1
  • path.dirname(pathname)
const path = require('path');
//创建一个文件路径
const pathStr = "c:/a/b/c/1.html";
//获取文件所在的目录
console.log(path.dirname(pathStr));// -->c:/a/b/c
  • path.extname(pathname)
const path = require('path');
//创建一个文件路径
const pathStr = "c:/a/b/c/1.html";
//获取文件的扩展名
console.log(path.extname(pathStr)); // --> .html
  • path.join([...paths])
const path = require('path');
const result = path.join('c:/','a/b','/c','/d','../11.js');
console.log(result); // --> c:\a\b\c\11.js
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,093评论 0 3
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,421评论 1 45
  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    w_zhuan阅读 3,607评论 2 41
  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    Myselfyan阅读 4,062评论 2 58
  • 第1章 JavaScript 简介 JavaScript 具备与浏览器窗口及其内容等几乎所有方面交互的能力。 欧洲...
    力气强阅读 1,111评论 0 0