● 在Node.js中,以模块为单位划分全部功能,而且提供了一个完整的模块加载机制,这时的咱们能够将应用程序划分为各个不一样的部分。 html
不可能用一个js文件去写所有的业务。确定要有MVC。 node
● 狭义的说,每个JavaScript文件都是一个模块;而多个JavaScript文件之间能够相互require,他们共同实现了一个功能,他们总体对外,又称为一个广义上的模块。 npm
● Node.js中,一个JavaScript文件中定义的变量、函数,都只在这个文件内部有效。当须要今后JS文件外部引用这些变量、函数时,必须使用exports对象进行暴露。使用者要用require()命令引用这个JS文件。 json
foo.js文件中的代码: api
1 var msg = "你好"; app 2 函数 3 exports.msg = msg;工具 |
msg这个变量,是一个js文件内部才有做用域的变量。 post
若是别人想用这个变量,那么就要用exports进行暴露。 学习
使用者:
1 var foo = require("./test/foo.js"); 2 3 console.log(foo.msg); |
使用者用foo来接收exports对象,也就是说,这里的foo变量,就是文件中的exports变量。
● 一个JavaScript文件,能够向外exports无数个变量、函数。可是require的时候,仅仅须要require这个JS文件一次。使用的它的变量、函数的时候,用点语法便可。因此,无形之中,增长了一个顶层命名空间。
js文件中,能够用exports暴露不少东西,好比函数、变量。
1 var msg = "你好"; 2 var info = "呵呵"; 3 4 function showInfo(){ 5 console.log(info); 6 } 7 8 exports.msg = msg; 9 exports.info = info; 10 exports.showInfo = showInfo; |
在使用者中,只须要require一次。
1 var foo = require("./test/foo.js"); |
至关于增长了顶层变量。全部的函数、变量都要从这个顶层变量走:
1 console.log(foo.msg); 2 console.log(foo.info); 3 foo.showInfo(); |
Node中,js文件和js文件,就是被一个个exports和require构建成为网状的。
不是靠html文件统一在一块儿的。
● 能够将一个JavaScript文件中,描述一个类。用
module.export = 构造函数名;
的方式向外暴露一个类。
也就是说,js文件和js文件之间有两种合做的模式:
1) 某一个js文件中,提供了函数,供别人使用。 只须要暴露函数就好了; exports.msg=msg;
2) 某一个js文件,描述了一个类。 module.exports = People;
● 若是在require命令中,这么写:
1 var foo = require("foo.js"); //没有写./, 因此不是一个相对路径。是一个特殊的路径 |
那么Node.js将该文件视为node_modules目录下的一个文件
● node_modules文件夹并不必定在同级目录里面,在任何直接祖先级目录中,均可以。甚至能够放到NODE_PATH环境变量的文件夹中。这样作的好处稍后你将知道:分享项目的时候,不须要带着modules一块儿给别人。
● 咱们可使用文件夹来管理模块,好比
1 var bar = require("bar"); |
那么Node.js将会去寻找node_modules目录下的bar文件夹中的index.js去执行。
每个模块文件夹中,推荐都写一个package.json文件,这个文件的名字不能改。node将自动读取里面的配置。有一个main项,就是入口文件:
1 { 2 "name": "kaoladebar", 3 "version": "1.0.1", 4 "main" : "app.js" 5 } 6 |
package.json文件,要放到模块文件夹的根目录去。
咱们刚才学习了,模块就是一些功能的封装,因此一些成熟的、常常使用的功能,都有人封装成为了模块。而且放到了社区中,供人免费下载。
这个伟大的社区,叫作npm。 也是一个工具名字 node package management
去社区搜索需求,而后点进去,看api。
若是要配置一个模块,那么直接在cmd使用
1 npm install 模块名字 |
就能够安装。 模块名字全球惟一。
安装的时候,要注意,命令提示符的所在位置。
1.咱们的依赖包,可能在随时更新,咱们永远想保持更新,或者某持某一个版本;
2.项目愈来愈大的时候,给别人看的时候,没有必要再次共享咱们引用的第三方模块。
咱们能够用package.json来管理依赖。
在cmd中,使用npm init能够初始化一个package.json文件,用回答问题的方式生成一个新的package.json文件。
使用
1 npm install |
将能安装全部依赖。
npm也有文档,这是package.json的介绍:
https://docs.npmjs.com/files/package.json
require()别的js文件的时候,将执行那个js文件。
注意:
require()中的路径,是从当前这个js文件出发,找到别人。而fs是从命令提示符找到别人。
因此,桌面上有一个a.js, test文件夹中有b.js、c.js、1.txt
a要引用b:
1 var b = require(“./test/b.js”); |
b要引用c:
1 var b = require(“./c.js”); |
可是,fs等其余的模块用到路径的时候,都是相对于cmd命令光标所在位置。
因此,在b.js中想读1.txt文件,推荐用绝对路径:
1 fs.readFile(__dirname + "/1.txt",function(err,data){ 2 if(err) { throw err; } 3 console.log(data.toString()); 4 }); |
1 var alldata = ""; 2 //下面是post请求接收的一个公式 3 //node为了追求极致,它是一个小段一个小段接收的。 4 //接受了一小段,可能就给别人去服务了。防止一个过大的表单阻塞了整个进程 5 req.addListener("data",function(chunk){ 6 alldata += chunk; 7 }); 8 //所有传输完毕 9 req.addListener("end",function(){ 10 console.log(alldata.toString()); 11 res.end("success"); 12 }); |
原生写POST处理,比较复杂,要写两个监听。文件上传业务比较难写。
因此,用第三方模块。formidable。
只要涉及文件上传,那么form标签要加一个属性:
1 <form action="http://127.0.0.1/dopost" method="post" enctype="multipart/form-data"> |