NodeJs 入门到放弃 — 入门基本介绍(一)
码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14450905.html
NodeJs 介绍
Node.js 就是运行在服务端的 JavaScript。是基于Chrome V8 引擎的JavaScript 运行环境
,简单理解就是一个可以让JavaScript脱离浏览器,执行的平台,并对JavaScript功能进行了增强(文件系统,模块,包,操作系统API,网络通讯,数据库操作等)
与JavaScript的区别:Node.js 是运行环境,JavaScript是一门编程语言
NodeJs 运行使用
安装:下载地址
REPL模式:(Read-Evaluate-Print-Loop),即
交互式命令行解析器
,可以直接在命令行输入node
,启动Node 的终端,直接编写NodeJs代码,适合用来测试和学习读取 - 读取用户输入,解析输入的 Javascript 数据结构并存储在内存中。
执行 - 执行输入的数据结构
打印 - 输出结果
循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。
运行JS文件:
node XXX.js
模块化
目前有三种流行的模块化规范:分别是 AMD(异步加载 requirejs),CMD(seajs),
Commonjs(同步加载,只适用于服务端 NodeJs平台)
NodeJs采用模块方式管理和组织代码,NodeJs所有的功能都存在每个模块中
模块组成
模块:一个具有特定功能的文件就是一个模块,模块之间相互独立,同时也可以相互共享数据,需要暴露数据和引入操作
/**
* NodeJs模块组成:
* 所有用户编写的代码都在模块中,模块就是文件(函数)
* 该函数有五个参数:
* exports: 暴露对象,可以将模块中的数据暴露给引用模块
* require: 引入模块,用于在A模块中引入B模块,并将B模块暴露的数据赋值给变量
* module: 模块对象,包含了当前模块的所有信息
* __filename: 当前模块的文件名
* __dirname: 当前模块所在的路径
*/
// arguments 属性只能在函数内部使用,因此说明模块就是函数
console.log(arguments.callee.toString()); // 打印出函数体本身
exports.username = 'Echoyya'
// console.log(arguments); // 可以将参数分别打印
require 函数
作用:在当前模块加载另一模块,不同类型的模块,引入模块时也有一些差异
模块分类:
自定义模块:开发者自己编写的功能文件即为自定义模块
若子模块没有暴露数据时,返回空对象
自定义模块必须加
./
,否则nodejs查找模块默认在node_modules
目录中查找主模块:整个项目的启动模块,有且仅有一个,对其他模块进行整合调度
// hello.js
var obj = require('./test')
console.log(obj); // {}
// test.js
console.log('Echoyya');
第三方模块:第三方程序员或公司开发的模块,先安装再使用,npm 安装,require 使用
系统模块:nodejs开发团队提供的功能模块 ,直接引入使用即可,无需安装
模块初始化:当一个模块被多次引入时,只执行一次,将暴露对象exports直接写入缓存,后续就直接读取缓存
exports 导出对象
作用:是当前模块的导出对象,用于导出模块公有方法和属性,其他模块通过require函数加载使用
exports.属性 = 值
exports.方法 = 函数
// test.js 暴露属性和方法
var username = 'Echoyya'
function showName(){
console.log('test模块:showName方法被调用');
console.log(module.exports === exports); // true
}
exports.name = username
exports.show = showName
// hello.js 加载调用
var obj = require('./test')
obj.show()
exports对象 和 module.exports对象,指同一个内存空间, module.exports对象才是真正的暴露对象
exports对象 是 module.exports对象的引用
,不能改变指向,只能添加属性和方法,若直接改变exports 的指向,则返回空对象console.log(module.exports === exports); // true
若想直接暴露对应的showName函数,可以改变module.exports的指向,module.exports=showName
module 模块对象
module.exports :暴露对象,exports对象只是对其的引用
// 常用语法:
module.exports.属性 = 值
module.exports.方法 = 函数
module.exports = 对象或函数
以下内容作为了解即可:
module.id:模块ID,模块名称
module.parent:模块的父级
module.filename:模块的文件名和路径
module.children:子模块列表
module.paths:模块查找路径,默认查找当前目录下的node_modules,若没有则向上查找,直至根目录,如果另外配置了NODE_PATH环境变量,也会去查找
npm和package.json文件
npm:(Node Package Manager)是基于Nodejs的包管理工具,能解决NodeJS代码部署上的很多问题
允许用户从NPM服务器下载别人编写的第三方包到本地使用。
允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
新版的nodejs已经集成了npm,可以通过输入 "npm -v" 来测试是否成功安装
package.json:以JSON格式描述nodejs项目的包描述文件,创建语法:npm init
或 npm init -y
(默认全部yes)
Nodejs 作用域
Nodejs中一个文件即是一个模块,由于nodejs在执行时会将用户编写的所有代码都封装在函数中,因此模块中用户使用var声明的变量或函数都是局部的只能在该模块中使用。
共享数据给其他模块使用的方法:
暴露对象:module.exports,文章上述有详细的描述
全局对象
:nodejs中没有window对象,但是有global对象
(尽量少用),可以把共享数据挂载到global对象上,以供其他模块使用,使用时global关键字可以省略
Nodejs 异步编程实现的三种方式
1. 回调函数
Node.js 异步编程的直接体现就是回调,Node 使用了大量的回调函数并且Node 所有 API 都支持回调函数。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。
回调函数:又称回调,将A函数的引用地址作为参数传递给B函数(调用者),B函数在执行过程中根据时机或条件决定是否调用A函数,A函数就是回调函数,一般作为函数的最后一个参数出现。
异步一定有回调函数
,但是回调函数不一定是异步
// 异步一定有回调函数
setTimeout(function () {
console.log('1');
}, 0);
console.log(2) // 输出结果 2 1
// 回调函数不一定是异步
console.log(1);
var arr = ['a','b','c']
arr.forEach(function(v){
console.log(v);
})
console.log(3); // 输出结果 1 a b c 3 即为同步
2. 事件
var http = require('http')
var server = http.createServer()
server.on('request',function(req, res){
res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"}) // 设置编码
res.write('<h1>访问nodejs服务</h1>')
res.end()
})
server.listen(80,function(){
console.log('服务器运行.....');
})
3. Promise 对象
promise是ES6中新增的对象,用于对异步的操作进行消息的传递,由于异步的返回结果时间顺序并不可控,使用promise就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。解决了以往的回调地狱现象。并提供统一的接口,使得控制异步操作更加容易。
promise有三种状态:pending
(进行中)、resolved
(已成功)和rejected
(已失败),对象的状态不受外界影响。
Promise
对象的状态改变,只有两种可能:从pending
变为resolved
和从pending
变为rejected
。一旦发生,状态就凝固不会再变。任何时候都可以得到这个结果。
Promise 提供的API远不止这些,还有许多强大的接口,更多具体用法,请参考阮老师的 [ECMAScript 6 入门]
var fs = require('fs')
function asyncReadFile(url){
return new Promise(function(resolved, rejected){
fs.readFile(url,function(err,data){
if(err) {
rejected(err)
}else{
resolved(data.toString())
}
})
})
}
var p1 = asyncReadFile('./file1.txt')
var p2 = asyncReadFile('./file2.txt')
// 异步的返回结果时间顺序并不可控,p2可能会先执行完毕,
p1.then(function(value){
console.log('p1',value);
},function(err){
console.log(err);
})
p2.then(function(value){
console.log('p2',value);
},function(err){
console.log(err);
})
// Promise.all()用于将多个Promise实例,包装成一个新的Promise实例
// 数组格式传入多个Promise实例可以执行顺序
//[p1,p2]
Promise.all([p1,p2]).then(function(datas){
console.log('[p1,p2]',datas);
},function(errs){
console.log(errs);
})
// [p2,p1]
Promise.all([p2,p1]).then(function(datas){
console.log('[p2,p1]',datas);
},function(errs){
console.log(errs);
})
NodeJs 入门到放弃 — 入门基本介绍(一)的更多相关文章
- mysql从入门到放弃-入门知识介绍
数据库在互联网网站的重要性 简单地说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构来组织和存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据.由于数据库不易扩展,所以,在一个互 ...
- Flink从入门到放弃(入门篇1)-Flink是什么
戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ...
- Vue.js2.0从入门到放弃---入门实例
最近,vue.js越来越火.在这样的大浪潮下,我也开始进入vue的学习行列中,在网上也搜了很多教程,按着教程来做,也总会出现这样那样的问题(坑啊,由于网上那些教程都是Vue.js 1.x版本的,现在用 ...
- 转-Vue.js2.0从入门到放弃---入门实例(一)
http://blog.csdn.net/u013182762/article/details/53021374 标签: Vue.jsVue.js 2.0Vue.js入门实例Vue.js 2.0教程 ...
- Flink从入门到放弃(入门篇2)-本地环境搭建&构建第一个Flink应用
戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ...
- Flink从入门到放弃(入门篇3)-DataSetAPI
戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ...
- Flink从入门到放弃(入门篇4) DataStreamAPI
戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ...
- 《vue.js2.0从入门到放弃》学习之路
原文地址: Vue.js2.0从入门到放弃---入门实例(一):http://blog.csdn.net/u013182762/article/details/53021374 Vue.js2.0从入 ...
- windows下nodejs express安装及入门网站,视频资料,开源项目介绍
windows下nodejs express安装及入门网站,视频资料,开源项目介绍,pm2,supervisor,npm,Pomelo,Grunt安装使用注意事项等总结 第一步:下载安装文件下载地址: ...
随机推荐
- 深入理解nodejs的HTTP处理流程
目录 简介 使用nodejs创建HTTP服务 解构request 处理Request Body 处理异常 解构response 简介 我们已经知道如何使用nodejs搭建一个HTTP服务,今天我们会详 ...
- HDU5213 Lucky【容斥+莫队】
HDU5213 Lucky 题意: 给出\(N\)个数和\(k\),有\(m\)次询问,每次询问区间\([L1,R1]\)和区间\([L2,R2]\)中分别取一个数能相加得到\(k\)的方案数 题解: ...
- P4570 [BJWC2011]元素 (线性基)
题意:n个石头 每个石头有a,b两个属性 要求选出一些石头使得没有一个子集的a属性xor和为0 且b属性和最大 题解:线性基例题了.. 好像需要理解一些性质 1.原序列里任一数都可有由线性基xor得到 ...
- Pokémon Army (easy version) CodeForces - 1420C1 dp
题意: 给你一个长度为n个序列v,你需要从中找一个子序列.这个子序列的值等于:子序列中奇数下标的值-偶数下标的值 你需要使得这个值尽可能大,让你输出这个最大值 题解: dp[i][0]表示:在原序列从 ...
- 【一天一个基础系列】- java之泛型篇
简介 说起各种高级语言,不得不谈泛型,当我们在使用java集合的时候,会发现集合有个缺点:把一个对象"丢进"集合之后,集合就会"忘记"这个对象的数据类型,当再次 ...
- windows创建p12格式的ios开发证书的流程
现在做ios开发,原生的开发已经不是第一选择,现在有很多不同的H5开发框架,在性能上都不输原生开发,而UI方便却能做得比原生更炫,比如CSS得灵活度肯定是比原生开发出来得应用更灵活的. 我们在开发IO ...
- 男孩周末班-k8s-架构图
k8s-三层网络结构图 k8s-核心组件原理图 k8s-服务架构图 k8s-部署架构 小结 RBAC 用户账户: 角色: role(普通角色),只能运行在特定名称空间下 clusterrole,对集群 ...
- Linux虚拟机封装成模板
对安装在VMware上的CentOS7.X进行封装,是为了后续的实验环境需要,可以批量去生成Linux系统.通过虚拟机模版来创建一台CentOS系统,跟原来机器一样,去掉了唯一性,而通过克隆出来的虚拟 ...
- springboot(四) rabbitMQ demo
RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多,刚才还看到新闻阿里将RocketMQ捐献给了apa ...
- 内存耗尽后Redis会发生什么
前言 作为一台服务器来说,内存并不是无限的,所以总会存在内存耗尽的情况,那么当 Redis 服务器的内存耗尽后,如果继续执行请求命令,Redis 会如何处理呢? 内存回收 使用Redis 服务时,很多 ...