node1

ES6

let:

 说明:访问不了num,但能访问abc.

 

 

 说明:let霸占了整个if的{},所以外面的num都无效。外面的let对里面的域有效,子域中的let对外面的作用域没影响,外面用不到里面的let。

 面试题:

 

 说明:for执行结束后,没有执行function,到了该调用function的时候,进去找i,此时i=2,所以结果是2,2

 说明:由于let,for产生了2个块级作用域,每个作用域中的变量值不同并保存在对应的块级作用域。执行函数时,到对应的域里面取。分别输出0,1

const:

 

 

 说明:复杂数据类型不可直接赋值,因为这样会改变地址,但是可以更改内部的数据。

总结:

 数组赋值:

 说明:[a,b,c]不是数组,只是把它们集中赋值。

对象解构:从对象的属性中提取值,赋给新变量:

 说明:name用于去匹配person当中的name属性,找到后将值赋给myName变量。

箭头函数,右边的{}是要定义的函数体,箭头函数中的this是箭头函数所在的作用域中的this:

 面试题:

 说明:obj没有产生作用域,所以箭头函数定义在了全局作用域下,而全局作用域下的this是window,而window没有age属性,则是undefined

 剩余参数,注意箭头函数没有arguments参数,此时args收集参数形成数组:

 

 扩展运算符:

 数组合并:

 

 Array.from()可以将伪数组转换为真正的数组,还能接受第二个函数参数用于处理伪数组中的每个元素:

 

 find:find参数函数中的item代表数组每个元素,index为对应的索引,find是看每个元素最后的处理结果如果是true,则收集起来再返回。也是找出第一个符合条件的。:

 

 

findIndex(),查找数组中第一个满足条件的元素的索引:

 includes()查看数组当中是否包含某个值:

 模板字符串,使用反引号`定义,``内若要解析变量,则放到${}中,还可以换行,可以调用函数:

 

 

 startsWith判断字符串是否以另一个字符串开头,endsWith是否结尾:

 repeat将某个字符串重复n次:

 set,类似于数组,只是过滤了重复的元素,使得最后每个元素都是唯一的,利用此可以构造新的元素唯一的树组:

 

 

 

 node.js:

是一个js运行环境,chrome也是运行环境

安装:

卸载更新:

删除以下:

 

再下载新的nodejs .

使用nvm可以管理一台电脑上的多个版本的nodejs

vscode:复制的时候只用点1下就能Ctrl+c了。 

 nodejs版本:

 查看node安装:node -v

命令行运行步骤:先去当前的目录下找thunder可执行文件,如果找不到,就去PATH所指向的目录里面找。

 .代表当前目录,require中的路径是相对于当前文件的路径,A的变量或函数要给别的文件用,就得在A里面用exports。B文件通过require就可以拿到A文件中exports里面的变量和函数,同时导入js文件时后缀可以省略.exports是一个对象,require之后相当于把exports对象返回了:

 

 

import,export,exports,module.exports,require之间的区别和关联

a.js导出:

var age=22

module.exports.age=age // exports.age = age,此时exports就代表module.exports,它只能给属性赋值:exports.aa=...,不能直接赋值:exports = aa,但是module.exports可以直接赋值

export const a =123; // 等价于 export {a,函数名,.....}

b.js导入:

const obj = require('./a.js')  // 相当于把a.js中的module.exports导入赋给obj。

import obj from './a.js'  // 效果类似上面,不加{}就是把a.js的module.exports拿过来,但是要在服务器开启时才管用

import {a} from './a.js'  // 此处要和export导出的变量名一致

module.exports,当给对象的属性赋值时,exports等价于module.exports。而如果给exports对象赋了对象,则其他文件以module.exports为准

 

系统模块的fs模块,readFile,第一个参数是相对于控制台的路径,第二个参数是编码,第三个是回调函数,当读完了会执行它:

 

 写入文件writeFile,第一个参数是向哪里写,第三个参数是回调函数:

 系统模块path,路径拼接join,能根据操作系统拼接多个字符串生成路径:

 __dirname能够获得当前工作目录的绝对路径:

下载第三方模块(类似于插件),会下载到当前的cmd目录下,创建node_modules,并放进去。本地安装:将模块安装供本项目使用,全局安装:供所有项目使用。

查看帮助文档https://www.npmjs.com/package

 卸载第三方:

 nodemon下载,-g是全局安装:

 输入一个命令,此时每次修改并保存文件...js,那么就会在控制台自动执行它,终止操作是Ctrl+c:

 nrm切换npm的下载地址,nrm ls是查看当前可用的下载地址,前面的*是正在使用的下载地址:

gulp:

安装gulp 

使用gulp:

 任务1:将一个文件复制到另一个文件:新建一个文件夹作为项目的根目录,再在这个目录下新建gulpFile.js,新建src文件夹存放项目源代码,新建dist文件夹存储处理后的文件:

在gulpfile.js中建立任务,task第一个参数是任务名,第二个参数回调函数是任务的具体内容:

 dest只是文件夹的名字,系统会在dist/css文件夹下创建base.css完全同名的文件 

 安装操纵任务的命令行工具,要安装它才能用gulp命令:

 执行任务:

第二个任务,将A,B文件公布部分抽取出来,并引用,再压缩(比如将多行代码放到一行)起来: 

为了压缩,下载gulp-htmlmin插件:

 在gulpFile.js中引入插件:

查看另一个插件的官方文档:

为了使得@@include生效,下载该插件用于抽取:

 引入插件:

 在src目录下新建common文件夹,再在里面新建一个header.html,将A,B文件当中的相同的代码剪切到head.html里面,然后在A,B文件当中的原来位置将之前剪切走的代码引入回来,此时只需一条include命令:

fileinclude表示将A和B中的include命令生效,htmlmin表示压缩它们,最后一行表示压缩到dist目录下,如果没有htmlmin,则只替换include并放到对应文件夹下:

说明:collapseWhitespace表示是否压缩空格

执行任务,之后在dist目录下产生结果:

任务3:解析less文件为css文件,并将所有的css文件放到dist目录下:

 在src的css目录下新建less文件:

 下载并引入插件,这个插件用于转换less到css:

 

 这个用于压缩css代码:

编辑任务:

执行任务:

 

 任务4:ES6代码转换并压缩

下载并引用插件,babel后面的2个是它所依赖的模块,并列写上可以同时下载:

 

 

测试编写一个es文件:

 编辑任务:babel那行是将es6装换为当前所支持代码,如es5,uglify是将其进行压缩,最后一行是目标位置。

 执行任务:

 任务5:复制文件夹:

关键代码:

 创建构建任务,让上面的任务一起执行,后面的数组元素是要执行的任务名字,然后执行:

 

 由于default是特殊的名字,所以可以省略不写,等价于:

package.json文件是项目的描述文件,在项目的根目录(假定为description)下输入命令生成json文件。npm install mime会在powershell当前目录下,创建node_modules,并把mime放到里面,同时也会更新当前目录的json文件中的dependencies。

创建package.json文件:

 解释package.json文件:

第一行是项目名字,第二行是版本号,第三行是描述信息,第四行是项目的主入口文件,第五行是命令别名,第六行是项目关键字,第八行是项目遵循的协议,ISC是开放源代码协议

 json的devDependencies:记录开发依赖,dependencies记录运营依赖,npm install是根据json安装开发依赖(所有依赖),npm install --production是根据json安装运营依赖

npm install mime是安装运营依赖,npm install mime --save-dev是安装开发依赖

 利用npm随便下载插件,此时json文件会自动写入依赖信息:

此时把package.json文件拷贝给另一个人,让他输入命令就能自动安装项目所需的node_modules。

 开发依赖:只有在开发中才需要,如gulp,运营依赖就不需要开发依赖了,开发依赖要大。

下载gulp,令其为开发依赖:

 此时在json中就有了记录:

删掉node_modules文件夹,模拟在开发环境中下载,此时会根据json下载全部插件:

 删掉,再模拟在运营环境中下载,此时只看dependencies而不看devDependencies:

 在使用npm时会更新package.json文件,它记录了项目模块之间的依赖关系,锁定包的版本

json的script可以设置,此时build就是后面那句话的别名:

他俩等价:

 

 没有后缀时,模块查找方法:

require('./find')先找当前目录下的find.js,找不到再找find文件夹下的index.js,再查看find文件夹下的package.js中的"main"值是什么,假如是aaa,则在find文件夹下找aaa,如果都没有则找不到。

 举例,此时引用并执行了:

没有路径和后缀时的查找:

  说明:1中,如果是系统模块则执行它。3中找的是node_modules下的js文件,4中找的是node_modules的find文件夹中的js

自测环境:

 创建web服务器:

说明:这里的app变量名就是服务器 

 说明:req即request,代表客户端,res即response。

执行命令启动服务器:

 浏览器访问:

http协议规定了客户端和服务器如何通信

查看请求与相应报文,request Headers,response Headers:

 查看请求方式:

说明:请求网址时默认get请求,第二个get是浏览器请求图标

 说明:如果不写method默认为get请求。第二个get时请求图标所用的。

根据请求方式做不同事情:

 服务器获取url:

 获取请求报文,报文中的属性:

 

 响应报文的HTTP状态码及设置:

 

 响应报文的内容类型及设置,res.writeHead:

 说明:指定内容类型为html之后就能显示h2了,也指定了编码类型,这样就能解析中文了。

利用url对象的parse方法将url的各个参数进行解析:

 

 进一步将query解析:

获得query对象和pathname,进一步判断: 

 

 处理post参数,data事件绑定到req上,可能会触发很多次data事件,此时自定义的param就接受每次的参数,postParams把所有参数都拼接起来。querystring.parse可以解析asd=as&asdasd这样的字符串成对象:

 

 总结:

 get的参数是在url中的,通过url.parse解析url得到包含参数的query对象。

post的参数是放在请求报文当中的,通过给res绑定data事件,用querystring.parse解析得到包含参数的对象,注意由于异步,处理参数得写到回调函数里面。

 返回客户端所请求的静态资源:

建立一个专门的文件夹存放静态资源,比如图片,css等,再在static目录下建立app.js文件:

 app.js:

 

下载mime插件用于查看客户端想要请求什么类型的页面:

 

 

 

 API:

 说明:用return拿不到结果。

利用回调函数拿到结果:

利用 promise得到异步API的执行结果:这里将fs的结果放到promise的resolve中,然后就能在外面对result进行处理。其实是resolve(result)调用了外面的函数:

 该下参数使得找不到文件,就打印err:

 

 利用promise依次读取A,B,C文件:

 

 异步函数终极解决方案:

  

 

 说明:r1,r2,r3为A,B,C文件的内容

const fs = require('fs');
const promisify = require('util').promisify;
const readFile = promisify(fs.readFile);

async function go () {
  console.log('a');
  let a = await readFile('./public/a.txt', 'utf8');
  let b = await readFile('./public/b.txt', 'utf8');
  let c = await readFile('./public/c.txt', 'utf8');

  console.log('b');

  console.log(a);
  console.log(b);
  console.log(c);
}
go();
console.log('c');  

控制台输出:a c b a文件内容 b文件内容 c文件内容

全局对象global:

猜你喜欢

转载自www.cnblogs.com/pjishu/p/12516946.html