nodejs内置模块(中)
【nodejs内置模块(中)】
路劲处理模块 path
模块概览
在nodejs中,path是个使用频率很高,但却让人又爱又恨的模块。部分因为文档说的不够清晰,部分因为接口的平台差异性。
将path的接口按照用途归类,仔细琢磨琢磨,也就没那么费解了。
获取路径/文件名/扩展名
获取路径:path.dirname(filepath)
获取文件名:path.basename(filepath)
获取扩展名:path.extname(filepath)
获取所在路径
例子如下:
12345var path = require('path');var filepath = '/tmp/demo/js/test.js';// 输出:/tmp/demo/jsconsole.log( path.dirname(filepath) );
获取文件名
严格意义上来说,path.basename(filepath) 只是输出路径的最后一部分,并不会判断是否文件名。
但大部分时候,我们可以用它来作为简易的“获取文件名“的方法。
12345678910var pat ...
nodejs内置模块(上)
【nodejs内置模块(上)】
nodejs 的官方API文档
Node.js 的API文档(英文): https://nodejs.org/docs/latest-v8.x/api/index.html
Node.js 的API文档(中文):http://nodejs.cn/api/
关于 Node.js 的内置模块和常见API,可以看官方文档。
查阅文档时,稳定指数如下:
红色:废弃。
橙色:实验。表示当前版本可用,其他版本不确定。也许不向下兼容,建议不要在生产环境中使用该特性。
绿色:稳定。与 npm 生态系统的兼容性是最高的优先级。
nodejs 中模块的分类
Node.js 应用由模块组成,采用 CommonJS 模块规范。Node.js中的模块分为三种:
内置模块
第三方模块
自定义模块
下面简单介绍一下。
内置模块
12345const process = require('process');const path = require('path');console.log(process.version);consol ...
nodejs模块化规范:CommonJS
【nodejs模块化规范:CommonJS】
前言
网站越来越复杂,js代码、js文件也越来越多,会遇到一些问题:
文件依赖
全局污染、命名冲突
程序模块化包括:
日期模块
数学计算模块
日志模块
登陆认证模块
报表展示模块等。
所有这些模块共同组成了程序软件系统。
一次编写,多次使用,才是提高效率的核心。
模块化的理解
什么是模块化
概念:将一个复杂的程序依据一定的规则(规范)封装成几个块(文件),并组合在一起。
模块的内部数据、实现是私有的, 只是向外部暴露一些接口(方法)与外部其它模块通信。
最早的时候,我们会把所有的代码都写在一个js文件里,那么,耦合性会很高(关联性强),不利于维护;而且会造成全局污染,很容易命名冲突。
模块化的好处
避免命名冲突,减少命名空间污染
降低耦合性;更好地分离、按需加载
高复用性:代码方便重用,别人开发的模块直接拿过来就可以使用,不需要重复开发类似的功能。
高可维护性:软件的声明周期中最长的阶段其实并不是开发阶段,而是维护阶段,需求变更比较频繁。使用模块化的开发,方式更容易维护。
部署方便
模块化规范
模块化规范的引入
假设我们引入模块 ...
npm的使用
【npm的使用】
包和npm
什么是包
由于 Node 是一套轻内核的平台,虽然提供了一系列的内置模块,但是不足以满足开发者的需求,于是乎出现了包(package)的概念: 与核心模块类似,就是将一些预先设计好的功能或者说 API 封装到一个文件夹,提供给开发者使用。
Node 本身并没有太多的功能性 API,所以市面上涌现出大量的第三方人员开发出来的 Package。
包的加载机制
Node.js中使用CommonJs模块化机制,通过npm下载的第三方包,我们在项目中引入第三方包都是:let xx = require('第三方包名'),究竟require方法加载第三方包的原理机制是什么,今天我们来探讨下。
require('第三方包名')优先在加载该包的模块的同级目录node_modules中查找第三方包。
找到该第三方包中的package.json文件,并且找到里面的main属性对应的入口模块,该入口模块即为加载的第三方模块。
如果在要加载的第三方包中没有找到package.json文件或者是package.json文件中没有main属性,则默认加载第三方包中的index.js文 ...
nodejs开发环境安装
【nodejs开发环境安装】
版本介绍
在命令窗口中输入 node -v 可以查看版本
0.x 完全不技术 ES6
4.x 部分支持 ES6 特性
5.x 部分支持ES6特性(比4.x多些),属于过渡产品,现在来说应该没有什么理由去用这个了
6.x 支持98%的 ES6 特性
8.x 支持 ES6 特性
Node.js 运行环境配置:通过 Node.js 安装包(不推荐)
去 Node.js 的官网下载安装包:
我们也可以在https://nodejs.org/en/download/releases/ 里下载历史版本。
后续如果需要安装其他版本,可以这样做:重新下载最新的安装包,覆盖安装即可。
但我们并不推荐直接采用 Node.js.msi(windows)或者 Node.js.pkg(Mac) 安装包进行安装,因为会产生如下问题。
通过 Node.js 安装包产生的问题:
安装新版本时,需要覆盖就版本;而且以前版本安装的很多全局工具包,需要重新安装。
无法回滚到之前的旧版本。
无法在多个版本之间切换(很多时候,不同的项目需要使用特定版本。或者,我想临时尝鲜一下新版本的特性 ...
nodejs简介
【nodejs简介】
前言
Node 的重要性已经不言而喻,很多互联网公司都已经有大量的高性能系统运行在 Node 之上。Node 凭借其单线程、异步等举措实现了极高的性能基准。此外,目前最为流行的 Web 开发模式是前后端分离的形式,即前端开发者与后端开发者在自己喜欢的 IDE 上独立进行开发,然后通过 HTTP 或是 RPC 等方式实现数据与流程的交互。这种开发模式在 Node 的强大功能的引领下变得越来越高效,也越来越受到各个互联网公司的青睐。
前端同学为什么要学习后端/后端同学为什么要学习前端
了解前后端交互流程。
前端同学能够和后台开发的程序员更佳紧密地结合、更顺畅地沟通。
当网站的业务逻辑需要前置时,前端人员需要学习一些后台开发的技术,以完成相应的任务;;反过来也一样。
拓宽知识视野和技术栈,能够站在全局的角度审视整个项目。
前端同学为什么要学 Node.js
1、Node.js 使用 JavaScript 语言开发服务器端应用,便于前端同学上手(一些公司甚至要求前端工程师掌握 Node.js 开发)。
2、实现了前后端的语法统一,有利于和前端代码整合,甚至共用部分代码 ...
Class extends
【Class extends】
简介
Class 可以通过extends关键字实现继承,让子类继承父类的属性和方法。extends 的写法比 ES5 的原型链继承,要清晰和方便很多。
12345class Point {}class ColorPoint extends Point {}
上面示例中,Point是父类,ColorPoint是子类,它通过extends关键字,继承了Point类的所有属性和方法。但是由于没有部署任何代码,所以这两个类完全一样,等于复制了一个Point类。
下面,我们在ColorPoint内部加上代码。
123456789101112class Point { /* ... */ }class ColorPoint extends Point { constructor(x, y, color) { super(x, y); // 调用父类的constructor(x, y) this.color = color; } toString() { ...
Class的语法
【Class的语法】
类的由来
JavaScript 语言中,生成实例对象的传统方法是通过构造函数。下面是一个例子。
12345678910function Point(x, y) { this.x = x; this.y = y;}Point.prototype.toString = function () { return '(' + this.x + ', ' + this.y + ')';};var p = new Point(1, 2);
上面这种写法跟传统的面向对象语言(比如 C++ 和 Java)差异很大,很容易让新学习这门语言的程序员感到困惑。
ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。
基本上,ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。上面的代码用 ES6 的class改写 ...
es6模块化
【es6模块化】
初识Module
(1)什么是模块
模块:一个一个的局部作用域的代码块。
(2)什么是模块系统
模块系统:系统的解决了模块化一系列问题。
模块化的写法(之前我们用立即执行函数模拟模块化,ES6 则实现了针对模块化的语法)
消除全局变量(模块中的变量都是局部的,不同模块之间不会相互干扰,可以通过特定语法暴露指定内容)
管理加载顺序(之前我们将一个总的 JavaScript 程序分几个文件写,但在最终合并调用时,js 的引入需要满足前后依赖关系。比如:被引用的 js 文件就一定要在引用它的 js 文件之前加载)
Module的基本用法
注意:Module 要生效,必须在服务器环境下才能执行。
普通的 HTML、JS 是本地文件环境,地址以 file 协议开头,服务器则以 http 或 https 开头。
方法:VSCode 中使用 Live Server 拓展,WebStorm 默认就是服务器环境。
一个 JS 文件就是一个模块
用 import 关键字导入模块
用 export 关键字导出模块需要暴露的部分
在使用 script 标签加载的时候,需要加上 ty ...
async 函数
【async 函数】
基本用法
async函数返回一个 Promise 对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。
下面是一个例子。
123456789async function getStockPriceByName(name) { const symbol = await getStockSymbol(name); const stockPrice = await getStockPrice(symbol); return stockPrice;}getStockPriceByName('goog').then(function (result) { console.log(result);});
上面代码是一个获取股票报价的函数,函数前面的async关键字,表明该函数内部有异步操作。调用该函数时,会立即返回一个Promise对象。
下面是另一个例子,指定多少毫秒后输出一个值。
123456789101112functi ...