在node中,以模块为单位划分所有功能。并提供了一个完整的模块加载机制,这时的我们可以将应用程序划分为各个不同的部分。
不可能用一个js文件去写全部的业务。肯定要有MVC。
狭义的说,每一个 Javascript文件都是一个模块;而多个 Javascript文件之间可以相互 require,他们共同实现了一个功能,他们整体对外,又称为一个广义上的模块。
Node中,一个 Javascript文件中定义的变量、函数,都只在这个文件内部有效,当需要从此JS文件外部引用这些变量、函数时,必须使用 exports对象进行暴露,使用者要用 requirel命令引用这个JS文件。
//foo.js文件中的代码
var msg="你好";
exports.msg=msg;
//使用者
var foo=require("./test/foo.js")
console.log(foo.msg);
js文件中,可以用 exports暴露很多东西,比如函数、变量。
var msg="你好”
var info="呵呵”
function showinfo(){
console. log(info)
}
exports. msg=msg;
exports. info=info;
exports. showinfo=showinfo;
Node中,js文件和js文件,就是被一个个 exports和 require构成为网状的。不是靠html文件统一在一起的。
一个 Javascript文件,可以向外 exports无数个变量、函数。但是 require 的时候,仅仅需要 rcquire这个JS文件一次。使用它的变量、函数的时候,用点(.)语法即可,所以,无形中,增加了一个顶层命名空间。
function People(name, sex, age){
this.name =name;
this.sex = sex;
this.age = age;
}
People. prototype={
sayhello: function(){
console. log(this.name +this.sex +this.age);
}
}
//此时, Peoplel就被视为构造函数,可以用new来实例化了
module.exports =People;
var People=require("./test/People.js");
var xiaoming= new People("小明","nan","12");
xiaoming. sayhello();
可以将一个 Javascript文件中,描述一个类。用module.export=构造函数名 的方式向外暴露一个类。
也就是说,js文件和js文件之间有两种合作的模式:
1、某一个js文件中,提供了函数,供别人使用。只需要暴露函数就行了;
exports. msg=msg
2、某一个js文件,描述了一个类;
module exports= People;
如果在 require命令中,这么写:
var foo= require(" foo. js");没有写./,所以不是一个相对路径。是一个特殊的路径,那么, Node. js将该文件视为 node_modules目录下的一个文件
node_modules文件夹并不一定在同级目录里面,在任何直接祖先级目录中,都可以。
甚至可以放到NODE_PATH环境变量的文件夹中。这样做的好处稍后你将知道:分享项目的时候,不需要带着 modules一起给别人。
我们可以使用文件夹来管理模块,比如:
var bar=require("bar");
那么 Node将会去寻找 node_modules目录下的bar文件夹中的 index. js去执行。
每一个模块文件夹中,推荐都写一个 package. json文件,这个文件的名字不能改。node将自动读取里面的配置。有一个main项,就是入口文件:
{
"name":"kaoladebar",
"version":"1.0.1",
"main":"app.js"
}
package. json文件,要放到模块文件夹的根目录去。
模块就是一些功能的封装,所以一些成熟的、经常使用的功能,都有人封装成为了模块并且放到了社区中,供人免费下戟。这个伟大的社区,叫做npm。(npmjs.com
)也是一个工具名字 node package management
去社区搜素需求,然后点进去,看api。
如果要配置一个模块,那么直接在cmd使用 npm install+模块名字 就可以安装。
模块名字全球唯一。
安装的时候,要注意,命令提示符的所在位置。
注意:
1.我们的依赖包,可能在随时更新,我们永远想保持更新,或者保持某一个版本;
2.项目越来越大的时候,给别人看的时候,没有必要再次共享我们引用的第三方模块。
在cmd中,使用 npm init可以初始化一个 package. json文件,用回答问题的方式生成一个新的 package文件。
使用
npm install
将能安装所有依赖。
npm也有文档,这是 package. json的介绍:npm文档
require()别的js文件的时候,将执行那个js文件。
注意:require()中的路径,是从当前这个js文件出发,找到别人。
假如,桌面上有一个a.js与test文件夹,test文件夹中中有b.js、c.js、1.txt
a要引用b:
var b=require("./test/b.js")
b要引用c:
var b=require("./c.js")
但是,fs等其他的模块用到路径的时候,都是相对于cmd命令光标所在位置。
所以,在b.js中想读1.txt文件,推荐用绝对路径:
fs.readFile(__ dirname+"1.txt",function(err,data).{
if(err){
throw err;
}
console. log( data.tostring())
})
自定义路由模块简单实例:
//router_index,js
var http=require("http");
var router=require("./router1.js");//引用自定义路由模块 文件
//创建服务器
var server=http.createServer(function(req,res){
res.writeHead(200,{'Content-Type':'text/html;charst=UTF8'});
if(req.url=="/"){
router.showIndex(req,res);
}
else if(req.url.substr(0,9)=="/student/"){
router.showStudent(req,res);
}
else{
router.show404(req,res)
}
})
server.listen(80,"127.0.0.1");
///////////////////////router1.js 文件////////////////////////////////////////
exports.showIndex=showIndex;
exports.showStudent=showStudent;
exports.show404=show404;
function showIndex(req,res){
res.writeHead(200,{"Content-Type":"text/html;charst=UTF8"})
res.end("我是首页")
}
function showStudent(req,res){
res.writeHead(200,{"Content-Type":"text/html;charst=UTF8"})
res.end("我是学生页面")
}
function show404(req,res){
res.writeHead(200,{"Content-Type":"text/html;charst=UTF8"})
res.end("404页面")
}
网友评论