nodejs_nodejs爬虫 - CSDN
nodejs 订阅
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型。 [1]  Node 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。 [2]  发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。Node对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好。V8引擎执行Javascript的速度非常快,性能非常好。Node是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。 展开全文
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型。 [1]  Node 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。 [2]  发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。Node对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好。V8引擎执行Javascript的速度非常快,性能非常好。Node是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。
信息
最新版本
13.9.0
类    别
运行于服务端的JavaScript解释器
开发者
Ryan Dahl
更新时间
2020-02-25
中文名
node.js
外文名
Node
发布时间
2009年5月
node.js发展史
收起全文
精华内容
参与话题
  • 从零开始nodejs系列文章-nodejs到底能干什么

    万次阅读 多人点赞 2018-08-24 18:16:22
     从零开始nodejs系列文章, 将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的 Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。...

    Node.JS 学习路线图

     

      从零开始nodejs系列文章, 将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的 Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮 助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网站,我们自己的Geek网站!!

      前言

      用Nodejs已经1年有余,陆陆续续写了48篇关于Nodejs的博客文章,用过的包有上百个。和所有人一样,我也从Web开发开始,然后到包管 理,再到应用系统的开发,最后开源自己的Nodejs项目。一路走来,Nodejs已经成为我做Web项目的标配。我非常愿意把原Java、PHP的 Web系统向Nodejs迁移,因为1个人可以很容易的完成10个人的活了。

      本文把我的学习和使用经验进行归纳总结,希望给新入门Nodejs的同学做一些指引。

      目录

    1. Nodejs的介绍
    2. 15个Nodejs应用场景
    3. Nodejs学习路线图

     1. Nodejs的介绍

      Node.js的是建立在Chrome的JavaScript的运行时,可方便地构建快速,可扩展的网络应用程序的平台。Node.js使用事件驱动,非阻塞I/O模型,轻量、高效,可以完美地处理时时数据,运行在不同的设备上。

      1.1. 谁在用Nodejs?

      从Nodejs官方网站的企业登记页(https://github.com/joyent/node/wiki/Projects,-Applications,-and-Companies-Using-Node),包括我们熟知的公司有LinkedIn, Yahoo, Paypal, eBay, Walmart,Groupon 还有很多的中小型公司,国内的公司如雪球、淘宝、网易、百度等也都有很多项目运行在Node.js之上。

      这些公司不仅是尝试在用,而且都在向Nodejs迁移。截止到2014年6月本文发稿时,已经有79693包在npm.org上面发布,而且这个数字还在快速增长中。

      那么接下来,大家肯定都会问为什么要是用Nodejs呢?

      1.2. 为什么要用Nodejs?

      从我使用体会来说,Node有4大优势:

    • 1. Nodejs基于Javascript语言,不用再单独新学一门陌生的语言,从而减低了学习的门槛。同时,Javascript语言在Web前端开发中至 关重要,特别HTML5的应用必须要使用,所以前后台统一语言,不仅可以实现程序员的全栈开发,还可以统一公共类库,代码标准化。单凭这一 点,Nodejs就已经赢得市场的青睐了。
    • 2. Nodejs并没有重新开发运行时环境,而是选择了目前最快的浏览器内核V8做为执行引擎,保证了Nodejs的性能和稳定性。
    • 3. Nodejs的开发非常高效,而且代码简单,得意于Nodejs的单线程机制。而Nodejs的另一个特点异步编程,让Nodejs处理IO密集型应用有了明显的优势。个人感觉,用Nodejs比Java做Web开发要高效10倍,比PHP的代码还要简单。
    • 4. Nodejs的社区在壮大,不仅包的数量在快速增加,而且包的质量也要明显好于其他语言的。很多明星级的包,都是简单而灵巧的,为了开发者的使用习惯而设 计。我最常用到的工具包,如socket.io, moment.js, underscore.js, async.js, express.js, bower.js, grunt.js, forever.js…,确实在改变我以前的编程习惯。

      当然,除了我使用Nodejs的理由,很多公司也都有自己的使用理由。

      ebay选择Nodejs的理由,可以归纳为以下4点:

    • 动态语言:开发效率非常高,并有能力构建复杂系统,如ql.io。
    • 性能和I/O负载:Nodejs非常好的解决了IO密集的问题,通过异步IO来实现。
    • 连接的内存开销:每个Node.js进程可以支持超过12万活跃的连接,每个连接消耗大约2K的内存。
    • 操作性:实现了Nodejs对于内存堆栈的监控系统。

      1.3. Nodejs不适合的领域

      每一种语言或平台都有不擅长领域,对于Nodejs来说最不擅长的领域在于CPU和内存的编程操作。

    • 1. 计算密集型应用,让Javascript和C去拼计算性能,估计是不可能赢的。
    • 2. 内存控制,让Javascript和Java比较复杂数据类型定义,也是很困难的。因为Javascript的面向对象是基于JSON的,而Java是直接使用内存结构。所以,通过JSON序列化和反序列的过程控制内存,Javascript就已经输了。
    • 3. 大内存的应用,由于V8引擎有内存设计的限制,32位环境中最大堆是1G,64位环境中最大堆也不到2G,如果要一次读入10G数据,对于Nodejs来说也无法实现。
    • 4. 静态服务器,虽然Nodejs的优势在IO密集集应用,但是和Nginx的处理静态资源还是有很大的差距。
    • 5. 不需要异步的应用:比如系统管理,自行化脚本等,还是Python更顺手,Nodejs的异步调用可能会给编程带来一些麻烦。

     2. 15个Nodejs应用场景

      我们已经对Nodejs有了初步的了解,接下来看看Nodejs的应用场景。

      2.1 Web开发:Express + EJS + Mongoose/MySQL

      express 是轻量灵活的Nodejs Web应用框架,它可以快速地搭建网站。Express框架建立在Nodejs内置的Http模块上,并对Http模块再包装,从而实际Web请求处理的功能。

      ejs是一个嵌入的Javascript模板引擎,通过编译生成HTML的代码。

      mongoose 是MongoDB的对象模型工具,通过Mongoose框架,可以进行访问MongoDB的操作。

      mysql 是连接MySQL数据库的通信API,可以进行访问MySQL的操作。

      通常用Nodejs做Web开发,需要3个框架配合使用,就像Java中的SSH。

      2.2 REST开发:Restify

      restify 是一个基于Nodejs的REST应用框架,支持服务器端和客户端。restify比起express更专注于REST服务,去掉了express中的template, render等功能,同时强化了REST协议使用,版本化支持,HTTP的异常处理。

      2.3 Web聊天室(IM):Express + Socket.io

      socket.io一个是基于Nodejs架构体系的,支持websocket的协议用于时时通信的一个软件包。socket.io 给跨浏览器构建实时应用提供了完整的封装,socket.io完全由javascript实现。

      2.4 Web爬虫:Cheerio/Request

      cheerio 是一个为服务器特别定制的,快速、灵活、封装jQuery核心功能工具包。Cheerio包括了 jQuery核心的子集,从jQuery库中去除了所有DOM不一致性和浏览器不兼容的部分,揭示了它真正优雅的API。Cheerio工作在一个非常简 单,一致的DOM模型之上,解析、操作、渲染都变得难以置信的高效。基础的端到端的基准测试显示Cheerio大约比JSDOM快八倍(8x)。 Cheerio封装了@FB55兼容的htmlparser,几乎能够解析任何的 HTML 和 XML document。

      2.5 Web博客:Hexo

      Hexo 是一个简单地、轻量地、基于Node的一个静态博客框架。通过Hexo我们可以快速创建自己的博客,仅需要几条命令就可以完成。

      发布时,Hexo可以部署在自己的Node服务器上面,也可以部署github上面。对于个人用户来说,部署在github上好处颇多,不仅可以省 去服务器的成本,还可以减少各种系统运维的麻烦事(系统管理、备份、网络)。所以,基于github的个人站点,正在开始流行起来….

      2.6 Web论坛: nodeclub

      Node Club 是用 Node.js 和 MongoDB 开发的新型社区软件,界面优雅,功能丰富,小巧迅速, 已在Node.js 中文技术社区 CNode 得到应用,但你完全可以用它搭建自己的社区。

      2.7 Web幻灯片:Cleaver

      Cleaver 可以生成基于Markdown的演示文稿。如果你已经有了一个Markdown的文档,30秒就可以制作成幻灯片。Cleaver是为Hacker准备的工具。

      2.8 前端包管理平台: bower.js

      Bower 是 twitter 推出的一款包管理工具,基于nodejs的模块化思想,把功能分散到各个模块中,让模块和模块之间存在联系,通过 Bower 来管理模块间的这种联系。

      2.9 OAuth认证:Passport

      Passport项 目是一个基于Nodejs的认证中间件。Passport目的只是为了“登陆认证”,因此,代码干净,易维护,可以方便地集成到其他的应用中。Web应用 一般有2种登陆认证的形式:用户名和密码认证登陆,OAuth认证登陆。Passport可以根据应用程序的特点,配置不同的认证机制。本文将介绍,用户 名和密码的认证登陆。

      2.10 定时任务工具: later

      Later 是一个基于Nodejs的工具库,用最简单的方式执行定时任务。Later可以运行在Node和浏览器中。

      2.11 浏览器环境工具: browserify

      Browserify 的出现可以让Nodejs模块跑在浏览器中,用require()的语法格式来组织前端的代码,加载npm的模块。在浏览器中,调用browserify编译后的代码,同样写在<script>标签中。

      用 Browserify 的操作,分为3个步骤。1. 写node程序或者模块, 2. 用Browserify 预编译成 bundle.js, 3. 在HTML页面中加载bundle.js。

      2.12 命令行编程工具:Commander

      commander 是一个轻巧的nodejs模块,提供了用户命令行输入和参数解析强大功能。commander源自一个同名的Ruby项目。commander的特性:自 记录代码,自动生成帮助,合并短参数(“ABC”==“-A-B-C”),默认选项,强制选项​​,命令解析,提示符。

      2.13 Web控制台工具: tty.js

      tty.js 是一个支持在浏览器中运行的命令行窗口,基于node.js平台,依赖socket.io库,通过websocket与Linux系统通信。特性:支持多 tab窗口模型; 支持vim,mc,irssi,vifm语法; 支持xterm鼠标事件; 支持265色显示; 支持session。

      2.14 客户端应用工具: node-webwit

      Node-Webkit 是NodeJS与WebKit技术的融合,提供一个跨Windows、Linux平台的客户端应用开发的底层框架,利用流行的Web技术 (Node.JS,JavaScript,HTML5)来编写应用程序的平台。应用程序开发人员可以轻松的利用Web技术来实现各种应用程序。Node- Webkit性能和特色已经让它成为当今世界领先的Web技术应用程序平台。

      2.15 操作系统: node-os

      NodeOS 是采用NodeJS开发的一款友好的操作系统,该操作系统是完全建立在Linux内核之上的,并且采用shell和NPM进行包管理,采用NodeJS不 仅可以很好地进行包管理,还可以很好的管理脚本、接口等。目前,Docker和Vagrant都是采用NodeOS的首个版本进行构建的。

     3. Nodejs学习路线图

      我们看到Nodejs已经被广发地应用在各种的场景了,针对Nodejs的应用场景,我们应该如何学习Nodejs呢?

      以下内容是我整理的文档和教程,每个软件包对应一篇文章,大家可以根据自己的需要进行阅读,完整的文章列表,可以查看:从零开始nodejs系列文章

      Nodejs在快速的发展着,软件包版本升级的很快,文章有运行不通的地方请参考官方文档解决。我也会不定期更新文章,尽量保持文章代码的可用性。

      祝大家在Nodejs的世界里,享受开发的乐趣!

    展开全文
  • nodejs简介

    万次阅读 多人点赞 2018-11-28 15:32:36
    nodejs ES6常用新语法 前言 是时候学点新的JS了! 为了在学习NodeJs之前,能及时用上语言的新特性,我们打算从一开始先学习一下JavaScript语言的最基本最常用新语法。本课程的内容,是已经假设你有过一些JavaScript...

    nodejs

    ES6常用新语法

    前言

    是时候学点新的JS了!

    为了在学习NodeJs之前,能及时用上语言的新特性,我们打算从一开始先学习一下JavaScript语言的最基本最常用新语法。本课程的内容,是已经假设你有过一些JavaScript的使用经验的,并不是纯粹的零基础。

    ES6新语法

    什么是ES6?

    由于JavaScript是上个世纪90年代,由Brendan Eich在用了10天左右的时间发明的;虽然语言的设计者很牛逼,但是也扛不住"时间紧,任务重"。因此,JavaScript在早期有很多的设计缺陷;而它的管理组织为了修复这些缺陷,会定期的给JS添加一些新的语法特性。JavaScript前后更新了很多个版本,我们要学的是ES6这个版本。

    ES6是JS管理组织在2015年发布的一个版本,这个版本和之前的版本大不一样,包含了大量实用的,拥有现代化编程语言特色的内容,比如:Promise, async/await, class继承等。因此,我们可以认为这是一个革命性的版本。

    环境搭建

    • 官网:

    • 下载nodejs, 并安装

    定义变量

    • 使用const来定义一个常量,常量也就是不能被修改,不能被重新赋值的变量。

    • 使用let来定义一个变量,而不要再使用var了,因为var有很多坑;可以认为let就是修复了bug的var。比如,var允许重复声明变量而且不报错;var的作用域让人感觉疑惑。

    • 最佳实践:优先用const,如果变量需要被修改才用let;要理解目前很多早期写的项目中仍然是用var。​

       	// 定义常量
          	const index = 1
          	// 定义变量
          	let num = 5
          	num = 6
    
       	let age = 18
       	//100 行代码
       	// 下面的代码,执行的时候会报错,不允许同一个变量重复声明
       	// 如果是var就不会报错
       	// let age=20
       	
       // 如果使用var声明i,在for循环的外面可以访问到i
       // 如果使用let声明i,在for循环的外面访问不到i
       for (let i = 0; i < 10; i++) {
           console.log(i)
       }
       
       console.log("for循环外部的值:" + i)
    

    解构赋值

    ES6 允许我们按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)

    • 数组的解构赋值

      	const arr = [1, 2, 3] //我们得到了一个数组
      	  let [a, b, c] = arr //可以这样同时定义变量和赋值
      	  console.log(a, b, c); // 1 2 3	
      
    • 对象的解构赋值(常用)

    		  const obj = { name: '俊哥',address:'深圳', age: '100'} //我们得到了一个对象
    		  let {name, age} = obj //可以这样定义变量并赋值
    		  console.log(name, age); //俊哥 100
    
    • 函数参数的解构赋值(常用)
    		  const person = { name: '小明', age: 11}
    		  function printPerson({name, age}) { // 函数参数可以解构一个对象
    		      console.log(`姓名:${name} 年龄:${age}`);
    		  }
    		  printPerson(person) // 姓名:小明 年龄:11
    
    

    函数扩展

    ES6 对函数增加了很多实用的扩展功能。

    • 参数默认值,从ES6开始,我们可以为一个函数的参数设置默认值

      function foo(name, address = '深圳') {
      	      console.log(name, address);
      	  }
      	  foo("小明") // address将使用默认值
      
      
    • 箭头函数,将function换成=>定义的函数,就是箭头函数

    		function getSum(x, y) {
    		    return x + y;
    		}
    		
    		// 箭头函数
    		// let getSum2=(x, y)=> {
    		//     return x + y;
    		// }
    		// 箭头函数简写,只能用在函数体只有一行代码的情况
    		let getSum2=(x, y)=> x + y;let result = getSum(1, 2);
    		// 自执行函数,定义函数以后,立刻调用函数,代码可读性比较差,不推荐这种写法
    		console.log(
    		    ((x, y)=> x + y)(1,2)
    		)
    

    Class继承

    由于js一开始被设计为函数式语言,万物皆函数。所有对象都是从函数原型继承而来,通过继承某个函数的原型来实现对象的继承。但是这种写法会让新学者产生疑惑,并且和传统的OOP语言差别很大。ES6 封装了class语法来大大简化了对象的继承。

    		class Person {
    		    constructor(name, age){
    		        this.name = name
    		        this.age = age
    		    }
    		    // 注意:没有function关键字
    		    sayHello(){
    		        console.log(`大家好,我叫${this.name}`);
    		    }
    		}
    		class Man extends Person{
    		    constructor(name, age){
    		        super(name, age)
    		    }
    		    //重写父类的方法
    		    sayHello(){
    		        console.log('我重写了父类的方法!');
    		    }
    		}
    		let p = new Person("小明", 33) //创建对象
    		p.sayHello() // 调用对象p的方法,打印 大家好,我叫小明
    		let m = new Man("小五", 33)
    		m.sayHello() // 我重写了父类的方法!
    
    

    总结

    ES6 的新语法有很多,有人将它总结为了一本书。当然,ES6提出的只是标准,各大浏览器和node基本实现了90%以上的新特性,极其个别还没有实现。我们目前讲的是最基本的一些语法,由于你们还未了解同步和异步的概念;Promise和async/await的内容将会在后面的课程中讲解。

    学习资源

    ES6 入门教程http://es6.ruanyifeng.com/

    各大浏览器的支持程度http://kangax.github.io/compat-table/es6/

    Node的发展历史和异步IO机制

    浏览器之战

    随着互联网的不断普及和Web的迅速发展,几家巨头公司开始了浏览器之战。微软推出了IE系列浏览器,Mozilla推出了Firefox浏览器,苹果推出了Safari浏览器,谷歌推出了Chrome浏览器。其中,微软的IE6由于推出的早,并和Windows系统绑定,在早期成为了浏览器市场的霸主。没有竞争就没有发展。微软认为IE6已经非常完善,几乎没有可改进之处,就解散了IE6的开发团队。而Google却认为支持现代Web应用的新一代浏览器才刚刚起步,尤其是浏览器负责运行JavaScript的引擎性能还可提升10倍,于是自己偷偷开发了一个高性能的Javascript解析引擎,取名V8,并且开源。在浏览器大战中,微软由于解散了最有经验、战斗力最强的浏览器团队,被Chrome远远的抛在身后。。。

    ![]

    Node的诞生

    浏览器大战和Node有何关系?

    话说有个叫Ryan Dahl的歪果仁,他的工作是用C/C++写高性能Web服务。对于高性能,异步IO、事件驱动是基本原则,但是用C/C++写就太痛苦了。于是这位仁兄开始设想用高级语言开发Web服务。他评估了很多种高级语言,发现很多语言虽然同时提供了同步IO和异步IO,但是开发人员一旦用了同步IO,他们就再也懒得写异步IO了,所以,最终,Ryan瞄向了JS。因为JavaScript是单线程执行,根本不能进行同步IO操作,只能使用异步IO。

    另一方面,因为V8是开源的高性能JavaScript引擎。Google投资去优化V8,而他只需拿来改造一下。

    于是在2009年,Ryan正式推出了基于JavaScript语言和V8引擎的开源Web服务器项目,命名为Node.js。虽然名字很土,但是,Node第一次把JavaScript带入到后端服务器开发,加上世界上已经有无数的JavaScript开发人员,所以Node一下子就火了起来。

    浏览器端JS和Node端JS的区别

    相同点就是都使用了Javascript这门语言来开发。

    浏览器端的JS,受制于浏览器提供的接口。比如浏览器提供一个弹对话框的Api,那么JS就能弹出对话框。浏览器为了安全考虑,对文件操作,网络操作,操作系统交互等功能有严格的限制,所以在浏览器端的JS功能无法强大,就像是压在五行山下的孙猴子。

    NodeJs完全没有了浏览器端的限制,让Js拥有了文件操作,网络操作,进程操作等功能,和Java,Python,Php等语言已经没有什么区别了。而且由于底层使用性能超高的V8引擎来解析执行,和天然的异步IO机制,让我们编写高性能的Web服务器变得轻而易举。Node端的JS就像是被唐僧解救出来的齐天大圣一样,法力无边。

    理解NodeJS的事件驱动和异步IO

    NodeJS在用户代码层,只启动一个线程来运行用户的代码。每当遇到耗时的IO操作,比如文件读写,网络请求,则将耗时操作丢给底层的事件循环去执行,而自己则不会等待,继续执行下面的代码。当底层的事件循环执行完耗时IO时,会执行我们的回调函数来作为通知。

    同步就是你去银行排队办业务,排队的时候啥也不能干(阻塞);异步就是你去银行用取号机取了一个号,此时你可以自由的做其他事情,到你的时候会用大喇叭对你进行事件通知。而银行系统相当于底层的事件循环,不断的处理耗时的业务(IO)。

    但是NodeJs只有一个线程用来执行用户代码,如果耗时的是CPU计算操作,比如for循环100000000次,那么在循环的过程中,下面的代码将会无法执行,阻塞了唯一的一个线程。所以,Node适合大并发的IO处理,不适合CPU密集型的计算操作。Web开发大部分都是耗时IO操作,所以Node非常适合进行Web开发。如果真的遇到了CPU密集的计算,比如从1亿个用户中计算出哪些人和你兴趣相投的这个功能,就非常耗CPU,那这个功能就交由C++,C,Go,Java这些语言实现。像淘宝,京东这种大型网站绝对不是一种语言就可以实现的。

    语言只是工具,让每一种语言做它最擅长的事,才能构建出稳定,强大的系统。

    NodeJs能做什么?

    NodeJs常用模块

    前言

    在浏览器端写JS,其实就是使用浏览器给我们提供的功能和方法来写代码。

    在Node端写JS,就是用Node封装好的一系列功能模块来写代码。NodeJS封装了网络,文件,安全加密,压缩等等很多功能模块,我们只需要学会常用的一些,然后在需要的时候去查询文档即可。

    API:

    npm介绍

    官网

    npm是Nodejs自带的包管理器,当你安装Node的时候就自动安装了npm。通俗的讲,当我们想使用一个功能的时候,而Node本身没有提供,那么我们就可以从npm上去搜索并下载这个模块。每个开发语言都有自己的包管理器,比如,java有maven,python有pip。而npm是目前世界上生态最丰富,可用模块最多的一个社区,没有之一。基本上,你所能想到的功能都不用自己手写了,它已经在npm上等着你下载使用了。

    npm的海量模块,使得我们开发复杂的NodeJs的程序变得更为简单。

    学习2个知识点:

    • 怎么生成package.json
    • 怎么从npm安装包,并保存到package.json文件中?

    全局变量

    全局变量是指我们在任何js文件的任何地方都可以使用的变量。

    • __dirname:当前文件的目录
    • __filename:当前文件的绝对路径
    • console:控制台对象,可以输出信息
    • process:进程对象,可以获取进程的相关信息,环境变量等
    • setTimeout/clearTimeout:延时执行
    • setInterval/clearInterval:定时器

    示例代码

    		// 获取进程信息
    		// console.log(global.process)
    		// 获取当前文件夹路径
    		console.log(__dirname)
    		// 获取当前文件的绝对路径
    		console.log(__filename)
    		// 开始标记
    		// console.time("timer")
    		// setTimeout(()=>{
    		//     console.log("一秒后开始执行")
    		// },1000)
    		// 结束标记
    		// console.timeEnd("timer")
    		
    		// setInterval(()=>{
    		//     console.log("执行")
    		// },1000)
    

    path模块

    path模块供了一些工具函数,用于处理文件与目录的路径

    • path.basename:返回一个路径的最后一部分
    • path.dirname:返回一个路径的目录名
    • path.extname:返回一个路径的扩展名
    • path.join:用于拼接给定的路径片段
    • path.normalize:将一个路径正常化

    示例代码

    	let path = require("path");
    	
    	// 获取路径当中的最后一部分
    	let basename = path.basename(__dirname);
    	
    	console.log(basename)
    	
    	// 获取上一级目录的路径
    	let dirname = path.dirname(__filename);
    	console.log(dirname)
    	
    	// 获取后缀名
    	let extname = path.extname("a.jpg");
    	console.log(extname)
    	// 拼接路径
    	let join = path.join("D:", "aa", "bb", "c.txt");
    	console.log(join)
    	// 标准化路径
    	let normalize = path.normalize("D:/aa//bb/c.txt");
    	console.log(normalize)
    
    

    fs模块

    文件操作相关的模块

    • fs.stat/fs.statSync:访问文件的元数据,比如文件大小,文件的修改时间

    示例代码

    	let fs = require("fs");
    	// 获取文件的属性
    	fs.stat("a.txt", (err, stats) => {
    	
    	    if (err) {
    	        console.log(err)
    	        return
    	    }
    	
    	    console.log(stats.birthtime)
    	    console.log(stats.isFile())
    	    console.log(stats.isDirectory())
    	
    	})
    
    - `fs.readFile/fs.readFileSync`:异步/同步读取文件
    
    - `fs.writeFile/fs.writeFileSync`:异步/同步写入文件
    

    示例代码

    	let fs = require("fs");
    	
    	// 读取文件
    	// fs.readFile("a.txt", (err, data) => {
    	//     if (err) {
    	//         throw err;
    	//     }
    	//
    	//     console.log(data.toString())
    	// })
    	// 写入文件
    	fs.writeFile("b.txt", "这是我使用API生成的文件内容", (err) => {
    	    if (err) {
    	        throw err;
    	    }
    	})
    
    - `fs.readdir/fs.readdirSync`:读取文件夹内容
    
    > 示例代码
    
    	let fs = require("fs");
    	let path = require("path");
    	let dirName = "aa";
    	// 读取文件夹中的内容(获取到的是文件夹中文件的名字)
    	fs.readdir(dirName, (err, files) => {
    	    if (err) {
    	        throw err
    	    }
    	    // 遍历文件夹中的内容,
    	    files.forEach((fileName) => {
    	        // 拼接文件路径
    	        let absPath = path.join(dirName, fileName);
    	        // 获取文件属性
    	        fs.stat(absPath, (err, stats) => {
    	            if (err) {
    	                throw err
    	            }
    	            console.log(fileName + "是否是文件夹:" + stats.isDirectory())
    	        })
    	    })
    	})
    
    - `fs.unlink/fs.unlinkSync`:删除文件
    
    - `fs.rmdir/fs.rmdirSync`:只能删除空文件夹,思考:如何删除非空文件夹?
    
      > 使用`fs-extra` 第三方模块来删除。
    
    
    > 示例代码
    
    	let fs = require("fs");
    	let fs2 = require("fs-extra");
    	// 删除文件
    	// fs.unlink("aa/a.txt", (err) => {
    	
    	//     console.log(err)
    	// })
    	// 删除文件夹
    	// fs.rmdir("aa", (err) => {
    	//     if (err) {
    	//         console.log(err)
    	//     }
    	// })
    	// 使用第三方模块删除文件
    	// fs2.remove("aa", (err) => {
    	//     if (err) {
    	//         throw err
    	//     } else {
    	//         console.log("success")
    	//     }
    	// })
    	// 同步方式读取文件
    	let readFileSync = fs.readFileSync("demo10_read_dir.js");
    	console.log(readFileSync.toString())
    
    - `fs.watchFile`:监视文件的变化
    
    > 示例代码
    
    	let fs = require("fs");
    	fs.watchFile("a.txt", {interval: 100}, (current, previous) => {
    	    console.log("current:" + current.mtime)
    	    console.log("previous:" + previous.mtime)
    	})
    

    stream操作大文件

    传统的fs.readFile在读取小文件时很方便,因为它是一次把文件全部读取到内存中;假如我们要读取一个3G大小的电影文件,那么内存不就爆了么?node提供了流对象来读取大文件。

    流的方式其实就是把所有的数据分成一个个的小数据块(chunk),一次读取一个chunk,分很多次就能读取特别大的文件,写入也是同理。这种读取方式就像水龙头里的水流一样,一点一点的流出来,而不是一下子涌出来,所以称为流。

    	let fs = require("fs");
    	// fs.readFile("ideaIU-2018.1.5.win.zip", (err, data) => {
    	//     if (err) {
    	//         throw err
    	//     }
    	//
    	//     console.log(data.toString())
    	// })
    	
    	// 读取大文件
    	let readStream = fs.createReadStream("ideaIU-2018.1.5.win.zip");
    	// 写入大文件
    	let writeStream = fs.createWriteStream("a.zip");
    	// let len = 0;
    	// readStream.on("data", (chunk) => {
    	//     len += chunk.length
    	//     // console.log(chunk.length)
    	//     writeStream.write(chunk)
    	// })
    	//
    	// readStream.on("end", () => {
    	//     console.log("文件读取完成," + len)
    	// })
    	
    	readStream.pipe(writeStream)		
    
    

    任务:用以下知识点完成大文件的拷贝。

    • fs.createReadStream/fs.createWriteStream
    • reader.pipe(writer)

    Promise和asnyc/await

    我们知道,如果我们以同步的方式编写耗时的代码,那么就会阻塞JS的单线程,造成CPU一直等待IO完成才去执行后面的代码;而CPU的执行速度是远远大于硬盘IO速度的,这样等待只会造成资源的浪费。异步IO就是为了解决这个问题的,异步能尽可能不让CPU闲着,它不会在那等着IO完成;而是传递给底层的事件循环一个函数,自己去执行下面的代码。等磁盘IO完成后,函数就会被执行来作为通知。

    虽然异步和回调的编程方式能充分利用CPU,但是当代码逻辑变的越来越复杂后,新的问题出现了。请尝试用异步的方式编写以下逻辑代码:

    先判断一个文件是文件还是目录,如果是目录就读取这个目录下的文件,找出结尾是txt的文件,然后获取它的文件大小。

    示例代码

    	function withoutpromise() {
    	    // 获取文件属性
    	    fs.stat(dirName, (err, stats) => {
    	        if (err) {
    	            throw err
    	        }
    	        // 如果是文件夹
    	        if (stats.isDirectory) {
    	            // 读取文件夹
    	            fs.readdir(dirName, (err, files) => {
    	
    	                if (err) {
    	                    throw err
    	                }
    	                // 遍历文件
    	                files.forEach((fileName) => {
    	                    // 获取后缀名
    	                    let extname = path.extname(fileName);
    	                    // 如果是txt文件
    	                    if (extname === ".txt") {
    	                        // 获取文件属性
    	                        fs.stat(path.join(dirName, fileName), (err, stats) => {
    	                            if (err) {
    	                                throw err
    	                            }
    	                            // 获取文件大小
    	                            console.log(fileName + "  =  " + stats.size)
    	                        })
    	                    }
    	
    	                })
    	            })
    	        }
    	    })
    	}
    

    恭喜你,当你完成上面的任务时,你已经进入了终极关卡:Callback hell回调地狱!

    为了解决Callback hell的问题,Promiseasync/await诞生。

    • promise的作用是对异步回调代码包装一下,把原来的一个回调函数拆成2个回调函数,这样的好处是可读性更好。语法如下:

      语法注意:Promise内部的resolve和reject方法只能调用一次,调用了这个就不能再调用了那个;如果调用,则无效。

    	let promise = new Promise((resolve, reject) => {
    	    //resolve: 代码执行过程中没有发生异常,正常执行的时候,会调用的方法
    	    //reject: 代码执行过程中发生了异常的时候,会调用的方法
    	    fs.readFile("aa/a1.txt", (err, data) => {
    	        if (err) {
    	            reject(err)
    	        } else {
    	            resolve(data)
    	        }
    	    })
    	});
    	
    	promise.then((data) => {
    	    console.log("代码正常执行了," + data)
    	}).catch((err) => {
    	    console.log("代码执行过程中发生了异常,"+err)
    	})
    • async/await的作用是直接将Promise异步代码变为同步的写法,注意,代码仍然是异步的。这项革新,具有革命性的意义。

      语法要求:

      • await只能用在async修饰的方法中,但是有async不要求一定有await
      • await后面只能跟async方法和promise

      假设拥有了一个promise对象,现在使用async/await可以这样写:

      	async function asyncDemo() {
      	
      	    try {
      	        // 当promise的then方法执行的时候
      	        let data = await promise;
      	        console.log(data.toString())
      	    } catch (e) {
      	        console.log("捕获到的异常:" + e)
      	    }
      	
      	}
      	
      	asyncDemo()
      
      
    **小任务**
    

    使用promise和async/await来重写上面的逻辑代码,来感受一下强大的力量吧!。

    • 示例代码
    
       async function withPromise() {// 把fs.stat方法转换为一个可以返回promise对象的方法let pStat = util.promisify(fs.stat);// 获取文件属性let stats = await pStat(dirName);// 如果是文件夹if (stats.isDirectory) {// 把fs.readdir方法转换为一个可以返回promise对象的方法let pReaddir = util.promisify(fs.readdir);// 读取文件夹let files = await  pReaddir(dirName)// 遍历文件
       ​	        files.forEach(async (fileName) => {// 获取后缀名let extname = path.extname(fileName);
       ​	
       ​	            if (extname === ".txt") {let statsFile = await  pStat(path.join(dirName, fileName));// 获取文件大小
       ​	                console.log(fileName + "  =  " + statsFile.size)}
       ​	
       ​	        })}}withPromise()
    

    异步代码的终极写法:

    1. 先使用promise包装异步回调代码,可使用node提供的util.promisify方法;
    2. 使用async/await编写异步代码。

    http 模块

    封装了http server 和 client的功能,就是说可以充当server处理请求,也可以发出请求。

    • http.createServer:创建server对象
      let http = require("http");let fs = require("fs");let server = http.createServer((request, response) => {
      ​	
      ​	    let url = request.url;
      
      
      ​	
      	    response.writeHead(200, {'Content-Type': 'text/html;charset=utf-8'});
      	    console.log("收到了请求")
      	    // 返回普通字符串
      	    // response.end("你好")
      	
      	    let person = {
      	        name: "zhangsan",
      	        age: 20
      	    }
      	    // 输出json字符串
      	    //  response.end(JSON.stringify(person))
      	
      	    if (url == "/a") {
      	        let readFileSync = fs.readFileSync("a.html");
      	        response.end(readFileSync)
      	    } else if (url == "/b") {
      	        let readFileSync = fs.readFileSync("b.html");
      	        response.end(readFileSync)
      	    }})
      
      server.listen(8000)
      
    • http.get:执行http get请求
    		let http = require("http");
    	​	
    	​	http.get("http://www.baidu.com", (response) => {
    	​	
    	​	    let data;
    	​	    response.on("data", (chunk) => {
    	​	        data += chunk.toString();})
    	​	
    		    response.on("end", () => {
    		        console.log(data)
    		    })
    		})
    
    

    【案例】文件浏览服务器

    功能需求:启动一个服务,当用户访问服务时,给用户展示指定目录下的所有文件;如果子文件是目录,则能继续点进去浏览。

    ​		
    ​		let http = require("http");let fs = require("fs");let path = require("path");
    
    
    ​		
    ​		let server = http.createServer((request, response) => {
    ​		
    ​		    showDir(request, response)})// 绑定端口
    ​		server.listen(8000)// 显示文件夹中的内容
    		function showDir(request, response) {
    		    // 获取请求路径
    		    let url = request.url;
    		
    		    let dirPath = "aa";
    		    // 如果请求的不是根目录,获取用户的请求路径
    		    if (request.url != "/") {
    		        dirPath = request.url
    		        dirPath = dirPath.substring(1, dirPath.length)
    		    }
    		    // 读取文件夹
    		    fs.readdir(dirPath, (err, files) => {
    		        // 有异常,向外抛出
    		        if (err) {
    		            throw err
    		        }
    		        // 拼接数据
    		        let data = "";
    		        files.forEach(fileName => {
    		            // 拼接路径
    		            let joinPath = path.join(dirPath, fileName);
    		            // 获取属性
    		            let stats = fs.statSync(joinPath);
    		            // 如果是文件夹,拼接a标签
    		            if (stats.isDirectory()) {
    		                data += `<li><a href="${joinPath}"> ${fileName}</a></li>`
    		            } else {
    		                // 不是文件夹,不拼a标签
    		                data += `<li>${fileName}</li>`
    		            }
    		        })
    		        response.end(buildHTML(data))
    		    })
    		}
    		
    		// 用于生成html页面
    		function buildHTML(data) {
    		    return `<!DOCTYPE html>
    		<html lang="en">
    		<head>
    		    <meta charset="UTF-8">
    		    <title>Title</title>
    		    <style>
    		    *{
    		    padding: 0;
    		    margin: 0;
    		    }
    		    
    		    li{
    		    list-style: none;
    		    padding: 0.5em 1em;
    		    background-color:#ddd;
    		    border-top: 1px solid #eee;
    		    }
    		    
    		    li:hover{
    		    background-color:#aaa;
    		    }
    		</style>
    		</head>
    		<body>
    		<ul>
    		${data}
    		</ul>
    		</body>
    		</html>`
    		}
    
    展开全文
  • 分分钟带你入门nodejs(初级)

    千人学习 2019-06-27 10:59:07
    跟着我的脚步,meetqy带你进入nodejs的世界。本课程适合有JavaScript基础或者前端实际工作经验的同学。
  • Nodejs极速入门

    万人学习 2018-10-22 21:38:10
    由King老师精心打造的Nodejs极速入门课程,从Nodejs介绍到环境下载安装,到Express框架的基础使用,用短的时间帮你入门Nodejs! 山哥出品,必属精品!
  • nodejs下载安装及配置环境

    万次阅读 多人点赞 2019-05-30 16:23:39
    使用vue,安装nodejs是基础,我在这把我自己安装步骤教给大家 1.下载 下载地址:https://nodejs.org/en/download/ 2.安装: 1.下载完之后,双击打开: 2.点击next开始安装 3.选择"接受按钮",进行下一步 4.选择...

    使用vue,安装nodejs是基础,我在这把我自己安装步骤教给大家

    1.下载

    下载地址:https://nodejs.org/en/download/
    在这里插入图片描述

    2.安装:

    1.下载完之后,双击打开:
    在这里插入图片描述
    2.点击next开始安装
    在这里插入图片描述
    3.选择"接受按钮",进行下一步
    在这里插入图片描述
    4.选择安装路径
    在这里插入图片描述
    5.安装你需要的模式
    在这里插入图片描述
    6.开始安装install
    在这里插入图片描述
    7.完成finish
    在这里插入图片描述

    安装完之后打开终端 window+R

    在这里插入图片描述

    cmd 回车;输入命令:“node -v” 查看版本号

    在这里插入图片描述

    出现版本号,说明你的电脑上已经有nodejs,安装成功!

    3.配置环境

    NodeJS和NPM安装好了以后并不能直接使用,默认情况下,NPM安装的模块并不会安装到NodeJS的程序目录,比如我们安装的时候设置的D盘,“D:\Program Files\nodejs”,而我们使用npm安装一个cluster模块他会出现在C盘默认的路径下面,所以,如果我们不修改npm的模块安装目录,那么它默认情况下都会安装到这里,随着你测试开发各种不同的项目,安装的模块越来越多,这个文件夹的体积就会越来越大,直到占满你的C盘。所以我们要修改npm的配置。

    1.在nodejs文件夹下,创建两个为文件夹: node_global;node_cecal

    这是用来放安装过程的缓存文件以及最终的模块配置位置
    在这里插入图片描述

    2.使用下面命令将npm的全局模块目录和缓存目录配置到我们刚才创建的那两个目录

    npm config set prefix "node_global文件的路径"
    npm config set cache "node_cache的文件路径"
    例如:npm config set prefix “D:\Program Files\nodejs\node_global”

    3.高级系统设置——环境变量

    新增系统变量:
    变量名填:NODE_PATH
    变量值填:(文件路径)
    在这里插入图片描述
    还需要在Path变量名中修改nodejs文件默认路径
    在这里插入图片描述
    修改完成后测试:
    输入命令:node 回车——再输入 require(‘cluster’)
    在这里插入图片描述
    出现以上内容说明配置完成

    展开全文
  • nodejs之http介绍

    千次阅读 2019-03-16 20:26:33
    http是nodejs中一个非常重要的内置模块,用于开发http服务器和web应用程序。 创建一个http服务非常简单。 04_http.js //04 http 介绍 //引入http 模块 var http=require("http"); //创建http...

    http是nodejs中一个非常重要的内置模块,用于开发http服务器和web应用程序。

    创建一个http服务非常简单。

    04_http.js

    //04 http 介绍
     
    //引入http 模块
    var http=require("http");
     
    //创建http服务器实例
    var server =http.createServer(function (req,res) {
     
        res.writeHead(200,{'content-type':'text/html;charset=utf-8'});
     
        res.end("你好nodejs");
     
    });
     
    //监听本地端口 3000
    server.listen(3000);
    console.log("nodejs server run at 3000");

    05_http_url_get.js

    //05 http url get
    //介绍 req 和res对象 、 url模块  、获取http get参数
    var http=require("http");
    var  url=require("url");
     
    var server =http.createServer(function (req,res) {
        var reqUrl = req.url;
     
        if(reqUrl=='/favicon.ico'){//忽略 ico小图标
            return ;
        }
     
         
        console.log(reqUrl);
        //使用url模块  解析req.url 得到一个urlObj  对象
         var urlObj= url.parse(reqUrl,true);
         console.log(urlObj);
     
     
        res.writeHead(200,{'content-type':'text/html;charset=utf-8'});
        res.write('请求url: '+reqUrl+'<br/>');
        res.write('pathname: '+urlObj.pathname+'<br/>');  //requestPage
        res.write('get参数name: '+urlObj.query['name']+'<br/>'); //get 请求参数
        res.write('get参数age: '+urlObj.query['age']+'<br/>');//get请求参数
        res.write('search: '+urlObj.search+'<br/>'); //查询字符串  ?name=zhangsan&age=22
     
        // 浏览器输入  http://localhost:3000/about?name=zhangsan&age=22
        //urlObj 对象如下
        // Url {
    //     protocol: null,
    //         slashes: null,
    //         auth: null,
    //         host: null,
    //         port: null,
    //         hostname: null,
    //         hash: null,
    //         search: '?name=zhangsan&age=22',
    //         query: { name: 'zhangsan', age: '22' },
    //     pathname: '/about',
    //         path: '/about?name=zhangsan&age=22',
    //         href: '/about?name=zhangsan&age=22' }
     
        res.end();//结束响应
    });
    server.listen(3000);
    console.log('nodejs server run at 3000');

     

    展开全文
  • nodejs可以用来做什么

    千次阅读 2019-03-07 09:52:09
    Node.JS&nbsp;学习路线图 ... 从零开始nodejs系列文章, 将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的 Javascript引擎。chrome浏...
  • nodejs及nmp安装

    千次阅读 2019-05-11 16:55:29
    默认npm的本地仓库在C盘下,移到nodejs安装目录。 npm config set prefix "D:\nodejs\node_global" npm config set cache "D:\nodejs\node_cache" 配置镜像 npm config set registry=...
  • NodeJS简介-node.js是什么?

    万次阅读 2019-04-05 15:14:34
    前言 node.js是什么本来应该是放在学习之后做的总结,但是在学习一门新语言或新的知识之前,还是应该对其有个大体上的了解,知道她是什么?她适用于哪些应用场景?她的优点及缺点?大体上弄清楚这些之后可以对其有...
  • Nodejs优缺点,使用场景

    千次阅读 2019-06-27 11:43:01
    NodeJS的特点 我们先来看看NodeJS官网上的介绍: Node.js is a platform built on Chrome’s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-...
  • nodejs作用

    千次阅读 2019-04-26 16:58:37
    Nodejs框架是基于V8的引擎,是目前速度最快的 Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮 助我们迅速建立web站点,比起PHP的开发效率更高,而且...
  • nodejs中实现sleep功能,暂停几秒.

    万次阅读 2018-01-08 21:10:31
    在使用nodejs爬虫的时候,经常会遇到别人的网站对频率的反爬机制, 这个时候如果不做处理程序就会挂掉,重新启动也会继续被屏蔽.这个问题怎么解决呢, 我的想法就是程序暂停10分钟或者更长的时间,继续爬取. 二 方法...
  • 初学NodeJS,就是要弄清楚什么是nodejs,能做什么,怎么用。。什么是nodejs? 脚本语言需要一个解析器才能运行,JavaScript是脚本语言,在不同的位置有不一样的解析器,如写入html的js语言,浏览器是它的解析器角色。...
  • 初学nodejs必看,nodejs入门良言。

    千次阅读 2018-06-28 15:48:16
    断断续续用nodejs开发也快一年了,不得不说本人天资驽钝实在不敢恭维技术,只能说久病成医,坑踩的多了就知道怎么避免了,在此写写几句自己踩过的坑,希望能帮到即将步入nodejs这行的同学们,注:这篇博客技术点不多...
  • NodeJS 安装及环境配置

    万次阅读 多人点赞 2019-01-25 14:44:32
    前言:作者最近也准备学习一些热门的前端技术,以前都是JQ一把梭(作者是前端菜鸟ε=(´ο`*)))唉)。...一、NodeJS下载 1.下载NodeJS安装包 下载地址:NodeJS下载 2.开始安装 打开安装包后,一直N...
  • Window 如何安装 Nodejs

    千次阅读 2019-06-03 10:10:26
    最近在学习 WebRtc,看到很多人都是用 nodejs 去搭建服务器的。 没办法,简单撸了一遍 js 的语法,就开始了;这篇先讲如何在window中搭建 nodejs 的环境 (电脑太差,运行不了 虚拟机,难受…) 一、下载 首先去到官网...
  • 学习NodeJS第三天:打造Nodejs的调试环境(中)

    万次阅读 热门讨论 2016-11-18 16:22:01
    2012-12-07 因追加《学习NodeJS第三天:打造Nodejs的调试环境(下)》的缘故,特此将原来的《下》篇改为《中》篇,如标题所示。 上一期我们为大家介绍了安装 Eclipse 调试插件的情况,这对于还不熟悉 Eclipse 开发...
  • Mac 安装 nodejs (图文详细步骤)

    万次阅读 多人点赞 2016-01-19 22:21:36
    Mac 下 安装 nodejs
  • 对于一个前台开发而言,没有使用过nodejs简直是一种耻辱,不过什么时候开始都不算晚,故以下是笔者在洗刷耻辱过程中的一点经验,供大家分享。 入门是在runoob的教程指导下开始的,但是教程里面更多的是介绍nodejs...
  • 创建第一个nodejs项目

    千次阅读 2019-02-01 17:30:41
    以前是一名安卓工程师,来新公司后,偶然接触到了nodejs项目,从此被nodejs吸引了。之后的文章都会记录工作中遇到的问题,有不对的地方还请各位读者朋友指正,大家共同学习!!话不多说,我们先来创建第一个nodejs...
1 2 3 4 5 ... 20
收藏数 180,932
精华内容 72,372
关键字:

nodejs