nodejs 是 JavaScript 的一个在后端的运行环境, 关于 nodejs 的认识, 我们可以看上一篇文章 <<初识 nodejs>>, 我们要使用 nodejs, 首先要安装 nodejs, 安装的东西你可理解为 java 中的运行环境一样, 至于怎么安装, 我们最好安装 nvm(nodejs version manage), 安装的过程也写在了另一篇博客 <>(那时懵懂期, 回头再修改的详细一点)
那么 nodejs 作为一个后台的平台, 他可以为我们提供的很多, 我们可以用 JavaScript 语言进行文件的获取, 删除等等文件操作, 我们可以用 JavaScript 开一个本地服务器, 我们可以和 mongoDB 配合来搭建后台, 他给我们前端带来了太多的惊喜, 让我们深深的迷恋上了它, 但正所谓学一个新知识时, 我们都需要从简, 从基础学起, 那么在 nodejs 环境下, 我们的基本语法又是怎样的呢
nodejs 是支持 ES6 的, 所以在这里你可以尽情的去写, 不用考虑浏览器不兼容了 (这里是后端, 哈哈), 安装好了 nodejs 后, 我们在终端输入 node, 就会进入到 nodejs 环境, 这里我们可以输入:
- console.log("hello world!");
可以看到我们控制台输出了 hello world, 我第一次写的时候还以为这是 chrome 的开发者模式呢, 这或许就是 chrom v8 引擎的作用吧, 我们这些简单的指令可以直接在终端中输出, 那么如果是运行一大段代码呢? 我们可以写个 js 文件里边,
- 在hello.js中
- var hello = function() {
- console.log("hello function");
- }
- hello();
然后 node hello.js, 这样我们文件中写的程序就能运行出来了, nodejsshi 是基于 commonJS 的, 所以当我们的程序变大的时候, 就可以使用模块了, nodejs 是模块化的, 什么是模块, 每个模块就是 nodejs 的每个功能, 我们有 http 模块来提供服务器, 有 fs 模块来提供对文件操作的各种功能, 我们写的代码可以分成一个一个的模块, 这样可以提高我们代码的复用性, 以及减少代码之间的耦合性, 可以避免函数名和变量名的冲突.
java 和 python 使用 import 来导入其他函数库, 而 php 和 ruby 是通过 require, 上边也说过, nodejs 是基于 CommonJS 的, 在 node 中我们可以使用 require 这个关键字来导入模块. 例如:
- var http = require('http');
- var fs = require('fs');
首先, 我们可以使用原生的和外部的模块, 这些模块都是别人写好的或者 nodejs 自带的, 他们都给我们提供各种各样的功能, 我们只需要直接 require 它们就能使用了,
其次, 我们也可以自己编写模块, 比如你讲一个输出 hello 的函数单独封装成一个模块,
- //这里是hello模块
- (function() {
- var hello = function() {
- console.log("hello");
- }
- export.hello = hello;
- })()
这里我们使用 exports 导出 hello 函数, 然后再另一文件中通过 require 导入另一个模块, 这时再另一个模块中,
- var hello = require('hello.js'); //然后运行hello
- hello.hello(); //这时输出hello
我们还有另一种导出方法, 在 hello.js 中
- module.exports = hello; //通过这种导出方法,我们在使用它的时候的用法为:
- ---
- var hello = require('hello.js');
- hello(); //这时输出hello
这时我们就出现了不同的地方
在讲他们的区别之前, 我们先来看一个例子, 这个例子以及他们区别的理解我是在学习的.
- var a = {
- name: "小明"
- };
- var b = a;
- console.log(a.name);
- console.log(b.name);
- //输出 小明 小明
- b.name = "小李";
- console.log(a.name);
- console.log(b.name);
- //输出 小李 小李
这里, 由于 a 直接赋给 b, 这是 b 相当于 a 的引用, a 和 b 指向同一块存储区域, 这是改变了 b 的 name, 相应的 a 的 name 也发生了改变. 那么这就引出了我们要讲的:
- module.exports 原本就是一个空对象
- exprots 是这个对象的一个引用变量
- 平时我们 require 进来的就是 module.exports 对象
上边这三大法则就是 module.exports 和 exports 的主要区别, 我们可以这样来看:
- 1 exports = module.exports;
- 2所以现在exports.hello = hello;
- 3就相当于module.exports.hello = hello;
- 4当另一文件导入
- var hello = require('hello.js');时5因为是导入了module.exports这个对象,
- 所以使用hello的时候,
- 是: hello.hello();
所以我们导出模块的时候, 直接使用 module.exports=hello; 就行了.
据说 nodejs 可以使用 c/c++ 编写二进制模块, 但因为前端出身的我虽然学过 c/c++ 但研究不深, 我还是好好的用 JavaScript 吧!
当我们需要使用一些线上的模块时, 只需要去 nodejs.org 里边去搜索, 然后使用 npm install 就可以了, npm 是和 nodejs 捆绑在一起的,
回调函数是什么呢? 我们对于 JavaScript 中的函数应该不陌生了吧, 回到函数就是 JavaScript 中的函数. 当在 nodejs 中, 回调函数是来实现异步调用的, 回调函数被称为要去完成的任务, nodejs 中很频繁的使用回调函数, nodejs 中的所有的 API 模块都是由回调函数所实现的. 由回调函数来实现异步调用, 其实就是给你造成一种假象, 让你像使用 ajax 一样让你感觉很顺畅, 不堵不堵不堵 (嘿嘿嘿)!
我们先提前看一下 nodejs 在读取文件的时候的一个操作
- 1 //这里有一个input.txt文件,里边的内容为:"这是一个测试文件"
- 2
- var fs = require('fs');
- 3
- var data = fs.readFileSync('input.txt'); //同步操作
- 4 console.log(data.toString());
- 5 console.log("程序结束");
运行这个文件后显示
- 1这是一个测试文件2程序结束3 //这是我们很容易理解的程序流程,程序从上往下一次执行,
那我们再来看一个
- //input.txt文件中的内容不变,
- var fs = require('fs');
- fs.readFile('input.txt',
- function(err, data) {
- if (err) {
- return console.eror(err)
- }
- console.log(data.toString());
- });
- console.log("程序结束");
这时我们再运行这个程序, 就会发现输出的内容为:
- 程序结束这是一个测试文件
- //这是我们会发现先输出的是"程序结束"
我们先不用去纠结上边那个函数是什么意思, 我们应该能看得出来, 第二次的函数是一个回调函数, 这就是我们的阻塞和非阻塞 IO 的区别, 当程序执行到异步的读文件时, 会先将这个相对耗时多的步骤存入一个事件循环 (looping) 中, 转而去执行下边的程序, 等到下边的程序执行完了之后再回去执行回调函数这个它存起来的任务, 而在程序执行的时候就给我造成一个感觉, 好快! 这就是我们异步调用, 至少目前我感觉, 这个异步调用时 nodejs 的利器.
nodejs 的基本语句还是 JavaScript, 只不过它是模块化开发, 更有利我们去管理代码, 他的异步调用时他的一大利器, 这不同于其他多线程的语言, 我们只是通过回调函数来实现这一功能, 所以它对服务器的压力也不大!
来源: http://www.cnblogs.com/blackgan/p/6005868.html