什么是Javascript?
Javascript能作什么?
浏览器中的Javascript能够作什么?
- 操做DOM(增删改查)
- AJAX/跨域
- BOM
- ECMAScript
浏览器中的Javascript不能作什么?
编程语言的能力取决于?
- 语言自己只是提供了定义变量、定义函数、定义类型、流程控制、循环结构之类的操做
- 取决于运行该语言的平台(环境)
- 对于js来讲,常常说的JS实际是ES,大部分能力都是由浏览器的执行殷勤决定
- BOM和DOM能够说是浏览器开放出来的接口
- 好比:Cordova中提供JS调用摄像头,操做本地文件的API
- Java既是语言也是平台
- Java运行在Java虚拟机(跨操做系统)
- PHP是语言也是平台
- C#语言,平台:.net framework
- C#能够运行在MONO这样的平台
- 由于有人须要将C#运行在Linux平台,因此出现了MONO
Javascript只能够运行在浏览器中吗?
- 不是
- 能运行在哪里,取决于这个环境有没有特定的平台
node是什么?(Ryan Dahl)
- Node是javascript运行于服务端的运行环境
- 注意:是Node选择了Javascript,不是Javascript发展出来一个Node ###Node的诞生
- 2008年左右,随着AJAX的普及,WEB走向复杂化、系统化
- 2009年2月Ryan Dahl想要建立一个轻量级,适应现代WEB开的平台
- 2009年5月Ryan Dahl在GitHub中开源了最第一版本,同年11月的JSConf就安排了NODE讲座
- 2010年末Joyent公司资助,Ryan Dahl也加入了改公司,专门负责NODE的开发
- 2011年7月在微软的支持下登陆Windows平台
Node在web中的用途
- node开发的Application处理用户的全部请求和给用户的响应
- 分发数据(调用NODE服务器接口,再去调用传统服务器)请求,渲染HTML页面
总结:Node是Javascript的运行环境(平台),不是一门语言,也不是Javascript的框架。javascript
环境配置
makdir .net->建立一个资源管理器不能建立的一些文件 node --use_strict->必须是严格模式css
匿名函数自执行的方式:
- (function(){console.log(1)})()
- +function(){console.log(1)}()
- !function(){console.log(1)}()
全局对象
- global(等价于客户端javascript的window对象)
- process.stdin->标准输入(采集用户的输入)
- process.stdout.write()->标准输出相似console.log();
模板字符串``中间能够随意换行
- var msg='hello';
- var a=1;
- process.stdout.write(
${msg} world
);
- process.stdout.write(
${msg} world ${a}
);
Debug
- vs code编辑器里面能够调试
- node debug XXX.js能够调试
- node-inspector执行后打开127.0.0.1:8080页面调试(如:node-debug d.js此时会自动打开浏览器调试界面google)
- devtool XXX.js也是调试有BUG
练习
- ctrl+c终止当前进程
- 简单的人际交互,如何在控制台接收用户的输入,如:e.js
异步操做
- 现实
- 程序>一、setTimeout();二、$.ajax()
node中的异步操做
- Node采用Chrome V8引擎处理Javascript脚本,V8最大的特色就是单线程运行,一次只执行一个任务。
- Node大量采用异步操做(asynchronous operation),即任务不是立刻执行,而是插在任务队列的尾部,等到前面的任务运行完成后再执行
- 提升代码的影响能力
什么是I/O
- I/O【input/output】
- 能够理解为从输入到输出之间的转化过程
- 好比:敲键盘(输入),看到编辑器出现字符(输出)
- 移动鼠标(输入),看到光标移动(输出)
回调函数的设计
- 对于一个函数若是须要定义一个回调函数:
- 回调函数的必定做为参数的最后一个参数出现:一、function getFile(name,job,callback){}
- 回调函数的第一个参数默认接收错误信息,第二个参数才是真正的回调数据(便于外界获取调用的错误状况);如:getFile('jason','coding',function(error,data){if(error) throw error;console.log(data);});
- Node统一约定
- 强调错误优先,由于以后的操做大部分都是异步方式,没法经过try catch捕获异常,因此错误优先的回调函数第一个参数为上一步的错误信息
非阻塞I/O-->其实就是Node的核心特性
事件驱动和非阻塞机制
- Node平台将一个任务连同该任务的回调函数放到一个事件循环系统中
- 事件循环高效的管理系统池同时高效执行每个任务
- 当任务执行完成事后自动咨询回调函数
非阻塞的优点
- 提升代码的响应效率
- 充分利用单核CPU的优点
- 改善I/O的不可预测带来的问题
- 如何提升一我的的工做效率
- 可是:目前大多数都是多核CUP
异步回调的问题(相对于传统的代码)
进程和线程
一、进程(XXX.exe)
- 每个正在运行的应用程序称之为进程
- 每个应用程序至少有一个进程
- 进程是用来给应用程序提供一个运行环境
- 进程是操做系统为应用程序分配资源的一个单位
二、线程
- 用来执行应用程序中的代码
- 在一个进程内部,能够有多个线程
- 在一个线程内部,同事只能作一件事
- 并且传统的开发方式大部分都是I/O阻塞的
- 因此须要多线程来更好的利用硬件资源
- 给人一种错觉:线程越多越好
2、模块化结构
- Node实现的CommonJS规范,因此可使用模块化的方式组织代码结构
- Node采用的模块化结果是按照CommonJS规范
- 模块与文件是一一对应关系,即加载一个模块,实际上就是加载对应的一个模块文件
CommonJS规范概述
CommonJS模块的特色
- 全部代码都运行在模块做用域,不会污染全局做用域
- 模块能够屡次加载,可是只会在第一次加载时运行一次,而后运行结果就被缓存了,之后再加载,就直接读取缓存结果,要想让模块再次运行,必须清除缓存
- 模块加载的顺序,按照其在代码中出现的顺序
module对象
- Node内部提供一个Module构建函数,全部模块都是Module的实例,属性以下:
- module.id模块的识别符,一般是带有绝对路径的模块文件名
- module.filename模块定义的文件的绝对路径
- module.loaded返回一个布尔值,表示模块是否已经完成加载
- module.parent返回一个对象,表示调用该模块的模块
- module.children返回一个数组,表示该模块要用到的其余模块
- module.exports表示模块对外输出的值!
- 载入一个模块就是构建一个Module实例
模块的定义
- 一个新的JS文件就是一个模块
- 一个合格的模块应该是有导出成员的,不然模块就失去了第一的意义
- 模块内部是一个独立(封闭)的做用域,模块之间不会冲突
- 模块之间必须经过导出导入的方式协同
- 导出方式:
- exports.name=value;
- module.exports={name:value};
- 此时就不必在模块内部写自执行函数了!!
- module.exports和exports
- module.exports是用于为模块导出成员的接口
- exports是指向module.exports的别名,至关于在模块开始的时候执行:var exports=module.exports;
- 一旦为module.exports赋值,就会切断以前二者的相关性
- 最终模块的导出成员以module.exports为准
模块的分类
- 文件模块:就是咱们本身写的功能模块文件
- 核心模块:Node平台自带的一套基本的功能模块,也有人称之为Node平台的API
- 第三方模块:社区或第三方我的开发好的功能模块,能够直接拿来用
模块化开发的流程
- 建立模块:new some.js
- 导出成员:module.exports={}
- 载入模块:var some=require('./some.js');
- 使用模块:some.add(1,2);
模块内全局环境(伪)
- 咱们以后的文件操做中必须使用绝对路径
- __dirname:用于获取当前文件所在目录的完整路径,在REPL环境无效
- __filename:用来获取当前文件的完整路径,在REPL环境一样无效
- module:模块对象
- exports:映射到module.exports的别名
- require():require.cache、require.extensions、require.main、require.resolve()
练习:命令行下的计算器,c.js和e.js
- c.js里是非模块化的
- e.js是模块化的(CommonJS规范)
- module.exports={a,b,c};ES6的'自动属性'
模块的载入:require函数简介
- node使用CommonJS模块规范,内置的require函数用于加载模块的文件
- require的基本功能是:读取并执行一个javascript文件,而后返回该模块的exports对象
- 若是没有发现指定的模块会报错!
require扩展名:规则>描述的越详细越准确,相似CSS的选择器优先级
- require加载文件时能够省略扩展名:require('./module1')
- 此时会默认先找require('./module1.js');
- 若是默认的.js文件不存在接下来会继续默认找require('./module1.json');
加载文件规则
- 经过"./"或"../"开头:则按照相对路径熊当前文件所在文件夹开始寻找模块:require('../xxx.js')>上级目录下找xxx.js文件;
- 经过/开头:则以系统根目录开始寻找模块:require('/Users/xxx/Documents/sss.js')>以绝对路径的方式找,无心义!;
- 若是参数字符串不以"./"或者"/"开始,则表示加载的是一个默认提供的核心模块(位于Node的系统安装目录中):require('fs')、require('http')、require('path')等等;
- 或者从当前目录向上搜索node_modules目录中的文件:require('my_module')>各级node_modules夹中搜索my_nodule.js文件;
- 若是require传入的是一个目录的路径,会自动查看该目录的package.json文件,而后加载main字段指定的入口文件
- 若是package.json文件没有main字段,或者根本就没有package.json文件,则默认找目录下的index.js文件做为模块:require('./filesModule')>当前目录下找filesModule目录中的index.js文件;
注意require('filename'):
- 加载的模块名字若是跟系统的模块冲突,系统的优先级最高!
- 就近原则去找node_modules文件夹下的filename文件
require的实现机制:自定义的的$require,g.js和模块module2.js
- 将传入的模块的ID经过加载规则找到对应的模块文件
- 读取这个文件里面的代码
- 经过拼接的方式为该段代码构建私有空间
- 执行该代码
- 拿到module.exports返回
__dirname与__filename:如f.js
- __dirname当前文件所在目录的完整路径
- __filename当前文件的完整路径 ###思考与练习:
- 一、如何定义和导入模块?
- 二、如何使用模块化的方式组织代码结构?
- 三、载入模块的规则
- 四、了解模块的加载机制
- 五、自定义一个$require相似require,如$require下面的:index.js
模块的缓存:如h.js
- 第一次加载某个模块时,Node会缓存该模块,之后再加载该模块就直接从缓存取出该模块的module.exports属性(不会再次执行该模块);
- 若是须要屡次执行模块中的代码,通常可让模块暴露行为(函数)
- 模块的缓存能够经过require.cache拿到,一样也能够删除
缓存是如何实现(如:i.js)
如何删除缓存(如:i.js),通常不会删除缓存
3、Node:核心模块、文件操做、文件流、网络操做
一、核心模块
-
核心模块的意义:html
- 若是只是在服务器运行javascript代码,意义不大,由于没法实现任何功能(读写文件,访问网络)
- Node的用处在于它自己还提供的一系列功能模块,用于操做系统运动
- 这些核心的功能模块在Node中的内置
-
内置的有以下模块java
Node Package
因为Node是一套轻内核的平台,虽然提供了一系列的内置模块,可是不足以知足开发者的需求,因而出现了包(Package)的概念。与核心模块相似,就是讲一些预先设计好的功能或者API封装到一个文件夹,提供给开发者使用node
1):包的加载机制
- 与内置模块相同,一样使用require方法,如:const express=require('express');
- 加载机制也和内置模块加载机制相同
- 加载注意事项:
- 先在系统核心(优先级最高)的模块中找
- 而后再到当前项目中的:node_mocules目录中去找
2):如何管理好本身的包
- 因为Node自己并无太多的功能性API。因此市面上涌现出大量的第三方人员开发出来的Package
- 包的生态圈一旦繁荣起来,就必须有工具去代替人脑或者文档的方式去管理
- 此时NPM诞生了~
NPM(Node Package Manager)
1):安装NPM
- NPM不须要单独安装,默认在安装Node的时候会自动一块儿安装NPM
- 可是Node附带的NPM可能不是最新版本,最好用下面的命令更新到最新版本:$ npm install npm -g
- 默认安装到当前系统Node所在的目录下
- 因为以前使用NVM的方式安装的Node因此须要从新配置NPM全局目录
2):配置NPM的全局目录?
- npm config set prefix [filepath]
- 将NPM目录配置到其余目录时,必须将该目录放到环境变量中,不然没法在全局使用
- npm config [ls|list|set|get] [name] [value]
- npm init [--yes|-y]
- npm search [name]
- npm info [name]
- npm install [--global|-g] [name]
- npm uninstall [--global|-g] [name]
- npm list [--global|-g]
- npm outdated [--global|-g]
- npm update [--global|-g] [name]
- npm run [task]
- npm cache [clean]
二、文件操做(important)
Node内核提供了不少与文件操做相关的模块,每一个模块都提供了一些最基本的操做API,在NPM中也有社区提供的功能包git
fs:
1):同步或者异步调用(如:day03/code/02.js)
- fs模块对文件的几乎全部操做都有同步和异步两种形式
- readFile()
- readFileSync()
- 区别:
- 同步调用会阻塞代码的执行,异步则不会
- 异步调用会将读取任务下达到任务队列,直到任务执行完成才会回调
- 异常处理方面,同步必须使用 try catch 方式,异步能够经过回调函数的第一个参数
- 同步比异步更加耗费时间
2):路径模块
在文件操做中,都必须使用物理路径(绝对路径),path模块提供了一些列与路径相关的APIgithub
3):什么是缓冲区
- 缓冲区就是内存中操做数据的容器
- 只是数据的容器而已
- 经过缓冲区能够很方便的操做二进制数据
- 并且在大文件操做时必须有缓冲区
若是读取文件没有指定编码的话,默认读取的是一个Buffer(缓冲区)
- Buffer的做用,对我们目前的状况来讲只不多使用场景
- 将图片转成BASE64编码(code/04.js)
- 对文字进行BASE64编码
4):为什么要有缓冲区
- JS是比较擅长处理字符串,可是早起的应用场景主要用于处理HTML文档,不会有太大批次的数据处理,也不会接触到二进制的数据
- 而在Node中操做数据、网络通讯是没办法彻底以字符串的方式操做的
- 因此在Node中引入了一个二进制的缓冲区的实现:Buffer
- buf.toString([encoding[, start[, end]]])这里也能够设置编码:如code/03.js