本文目录一览:
- 1、commonjs需要安装node吗
- 2、简述什么是commonjs,以及其与nodejs的关系
- 3、如何在vscode中使用nodejs
- 4、node.js 基础操作
- 5、如何在node.js中使用requirejs
commonjs需要安装node吗
Common.js是VC中通过js创建项目模板的,出现这个问题不会影响使用。这个问题要解决就重新安装,或许你修改了编译器,解释器,它无法识别该js的版本,所以报错。
简述什么是commonjs,以及其与nodejs的关系
自从CommonJS和NodeJS两个项目的出现,JavaScript作为本地编程语言的这种特殊应用形式,才开始进入进入大众的视野。
说明什么是CommonJS。 另外随着并行计算的普及,像JavaScript这种函数式语言,由于其固有的易于进行并行计算的特性,将有更广阔的应用前景。
如何在vscode中使用nodejs
一、使用Express创建项目[这两步都在dos 模式下执行]
1,安装全局的Express!(已安装请忽略)
npm install -g express
2,创建项目
创建项目(创建文件夹名称ExpressApp)
express ExpressApp
小插曲:如果你习惯了Linux下的环境,你可以在自己电脑上安装cmder(不知道是什么东西,请自行百度),这个命令行工具排版漂亮,不像微软的dos 那么枯燥!我用的是Mini版本,如果你想体验linux下的全部功能,可以下载full版本。
3,下载第三方包
(1)cmd命令行切换到项目目录
cd d:\nodejs\ExpressApp
(2)根据需要编辑package.json,运行如下指令安装第三方包
npm install
在项目目录下node_modules可见安装好的第三方包
ExpressApp
|– node_modules
(3)运行项目
npm start
输出如下:
ExpressApp@0.0.0 start d:\Nodejs_Workspace\ExpressApp
node ./bin/www
注:npm start指令会自动执行node ./bin/www
在浏览器中输入,可访问Express欢迎页面
二、使用VSCode开发Nodejs
1、VSCode打开Nodejs
code d:\nodejs\ExpressAppcode.
注:在当前项目下创建ExpressApp.bat,输入“code .”即可,下次直接此文件直接使用VSCode打开Nodejs项目
2、添加智能提示
VSCode打开Nodejs项目,默认是没有智能提示。
(1)使用TypeScript Definition Manager(TSD)在项目中下载所需的tsd文件,VSCode中打开时有智能
全局安装tsd(如已安装忽略)
npm install -g tsd
下载所需的组件提示(以下载node、express、requirejs提示为例)
tsd query node --action installtsd query express --action installtsd install require
注:
①多个提示组件在query参数后可以空格分隔简写为tsd query node express –action install
②组件会项目目录下添加typings文件夹
|– typings
|– node
|– express
|– require
(2)添加js文件引用的智能提示
假如在文件引用另外一个文件common.js时,文件头添加如下
{ // See // for the documentation about the jsconfig.json format "compilerOptions": { "target": "es6", "module": "commonjs", "allowSyntheticDefaultImports": true }, "exclude": [ "node_modules", "bower_components", "jspm_packages", "tmp", "temp" ]}
(小提示,如果你引入了rquire,那么你的编辑器右下方会显示一个“灯泡”的提示,你只要点灯泡就不用自己苦逼的写这个配置文件了)
此配置表示代码服从ES5标准并使用commonjs规范,发VScode下有此配置之后,可以实现在文件中对require引用js文件的智能提示。(我测试时无此配置也会有智能提示,不清楚什么原因)
node.js 基础操作
require 函数用来在一个模块中引入另外一个模块。传入一个模块名,返回一个模块导出对象。用法: let cc = require("模块名") ,其中模块名可以用绝对路径也可以用相对路径,模块的后缀名.js可以省略。例如:
require()函数用两个作用:
exports 对象用来导出当前模块的公共方法或属性,别的模块通过 require 函数使用当前模块时得到的就是当前模块的 exports 对象。用法: exports.name ,name为导出的对象名。例子:
module.exports 用来导出一个默认对象,没有指定对象名,常见于修改模块的原始导出对象。比如原本模块导出的是一个对象,我们可以通过module.exports修改为导出一个函数。如下:
3.加载第三方包
Node.js中使用 CommonJs 模块化机制,通过 npm 下载的第三方包,我们在项目中引入第三方包都是: let xx = require('第三方包名') ,究竟 require 方法加载第三方包的原理机制是什么,今天我们来探讨下。
require('第三方包名') 优先在加载该包的模块的同级目录 node_modules 中查找第三方包。
找到该第三方包中的 package.json 文件,并且找到里面的 main 属性对应的入口模块,该入口模块即为加载的第三方模块。
如果在要加载的第三方包中没有找到 package.json 文件或者是 package.json 文件中没有 main 属性,则默认加载第三方包中的 index.js 文件。
如果在加载第三方模块的文件的同级目录没有找到 node_modules 文件夹,或者以上所有情况都没有找到,则会向上一级父级目录下查找 node_modules 文件夹,查找规则如上一致。
如果一直找到该模块的磁盘根路径都没有找到,则会报错: can not find module xxx 。
4.npm命令
npm 英文全称: node package manager ,npm 为你和你的团队打开了连接整个 JavaScript 天才世界的一扇大门。它是世界上最大的软件注册表,每星期大约有 30 亿次的下载量,包含超过 600000 个 包(package) (即,代码模块)。来自各大洲的开源软件开发者使用 npm 互相分享和借鉴。包的结构使您能够轻松跟踪依赖项和版本。我们平时开发项目都是需要使用npm下载依赖,常见的npm命令总结如下:
5.文件读取
var fs = require('fs')
同步:
var content = fs.readFileSync('hello.txt',{flag:'r',encoding:"utf-8"})
异步(默认):
flag:读取模式
encoding:编码格式
7.文件写入
var fs = require('fs')
格式:write=w read=r append =a
异步:
8.文件删除
fs . unlink ( 'lc.txt' , function (){
9.buffer缓冲区
1、数组不能进行二进制数据的操作2、js数组不像java、python等语言效率高3、buffer内存空间开辟出固定大小的内存
let buf1 = Buffer.alloc(10)
console.log(buf1)
allocUnsafe(之前的一些内容)(效率高)
10.文件目录
var fs = require('fs')
fs.readdir(path,callback)
导入 readline 包
let readline = require('readline');
实例化接口对象(process对象,stdout/in输入输出)
question方法 提问
close 事件监听
11.文件流
var fs = require('fs')
语法: fs.createWriteStream(文件路径,【可选的配置操作】)
let ws = fs.createWriteStream("hello.txt",{flags:"w",encoding:"utf-8"});
let ws = fs.createWriteStream("hello.txt",{flags:"w",encoding:"utf-8"});
实践
fs.createReadStream(路径,【可选的配置项】)
文档
let rs = fs.createReadStream('hello.txt',{flags:'r',encoding:"utf-8"})
音乐
let rs = fs.createReadStream('snake.mp4',{flags:'r'})
读取时写入
let ws = fs.createWriteStream('a.txt',{flags:"w",encoding:"utf-8"})
createReadStream.pipe(createWriteStream)
链式是通过连接输出流到另外一个流并创建多个流操作链的机制。链式流一般用于管道操作。
接下来我们就是用管道和链式来压缩和解压文件。
创建 compress.js 文件, 代码如下:
代码执行结果如下:
执行完以上操作后,我们可以看到当前目录下生成了 input.txt 的压缩文件 input.txt.gz。
接下来,让我们来解压该文件,创建 decompress.js 文件,代码如下:
12.node事件
Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
Node.js 几乎每一个 API 都是支持回调函数的。
Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.
没有使用 events 包 仅使用JavaScript事件监听进行事件驱动
Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。
这个模型非常高效可扩展性非常强,因为 webserver 一直接受请求而不等待任何读写操作。(这也称之为非阻塞式IO或者事件驱动IO)
在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。
Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:
以下程序绑定事件处理程序:
我们可以通过程序触发事件:
接下来让我们执行以上代码:
在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。
接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:
创建 main.js 文件,代码如下:
以上程序中 fs.readFile() 是异步函数用于读取文件。如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。
如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。
执行以上代码,执行结果如下:
接下来我们删除 input.txt 文件,执行结果如下所示:
因为文件 input.txt 不存在,所以输出了错误信息。
Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。
Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.readStream 对象会在文件被打开的时候触发一个事件。所有这些产生事件的对象都是 events.EventEmitter 的实例。
events 模块只提供了一个对象:events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。
你可以通过require("events");来访问该模块。
EventEmitter 对象如果在实例化时发生错误,会触发 error 事件。当添加新的监听器时,newListener 事件会触发,当监听器被移除时,removeListener 事件被触发。
下面我们用一个简单的例子说明 EventEmitter 的用法:
执行结果如下:
运行这段代码,1 秒后控制台输出了 'some_event 事件触发' 。其原理是 event 对象注册了事件 some_event 的一个监听器,然后我们通过 setTimeout 在 1000 毫秒以后向 event 对象发送事件 some_event,此时会调用some_event 的监听器。
EventEmitter 的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter 支持 若干个事件监听器。
当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。
让我们以下面的例子解释这个过程:
执行以上代码,运行的结果如下:
以上例子中,emitter 为事件 someEvent 注册了两个事件监听器,然后触发了 someEvent 事件。
运行结果中可以看到两个事件监听器回调函数被先后调用。这就是EventEmitter最简单的用法。
EventEmitter 提供了多个属性,如 on 和 emit 。 on 函数用于绑定事件函数, emit 属性用于触发一个事件。接下来我们来具体看下 EventEmitter 的属性介绍。
如何在node.js中使用requirejs
requirejs官方提供了一个可用于node的适配器 r.js 。有两种方法可以在项目里面加入此库。
1. npm
在具体项目目录下使用如下命令来引入requirejs:
npm install requirejs
windows环境下安装需要注意不要加上 -g 全局开关,否则不能正常安装。
安装完成后,可使用 require('requirejs') 来加载requirejs。
2. 下载r.js
如果不想使用npm,也可以直接下载r.js,并把它放到项目中达到同样的目的。
点击下载。
在项目中通过 require('/path/to/r.js') 来加载requirejs。
配置
配置requirejs
var requirejs=require('requirejs');
requirejs.config({
//把node自身的require方法传递给requirejs
nodeRequire: require
});
requirejs(["foo","bar"],function(foo,bar){});
在需要使用requirejs的地方可以用上面的代码来配置requirejs。首先加载requirejs模块,命名为 requirejs (可以为其他命名)。然后对 requirejs 进行配置。配置的方法和参数可以参照浏览器版本的requirejs的 配置说明 。不过有一点不同,如代码所示,我们需要把node的 require 方法引进来。最后一行是简单地加载模块的示例,requirejs会尝试把 foo 和 bar 两个模块当成AMD模块来加载,如果失败,则会调用node的 requie 方法来把它们当作commonjs模块加载。为了实现这样的适应性,所以我们需要配置node的 require方法。但实际测试并不尽如人意,保险起见,还是对AMD模块使用 requirejs 加载,对commonjs模块使用 require 加载。
构造AMD格式的node模块
在node中定义的模块是commonjs模块,如果想要构造AMD模块,我们需要amdefine 这个包。
安装amdefine
同样,可以使用npm进行安装,在项目目录下执行:
npm install amdefine
在windows下也存在无法全局安装的问题,需要对项目单独安装。
定义define方法
if(typeof define !== 'function'){
var define=require('amdefine')(module);
}
amdefine提供了包装AMD模块的 define 方法。不过上面代码中对于node中是否包含define方法的检测判断请保留,最好原封不动地将这几行拷贝到自己的项目中。这样,我们就可以像使用前端requirejs一样,定义和使用AMD模块。