# route.js
**Repository Path**: dingyue/route.js
## Basic Information
- **Project Name**: route.js
- **Description**: 路由注册/解析器,它在不刷新页面的情况下,利用“#”符号组织不同的URL路径,并根据不同的URL路径来匹配不同的回调方法
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 38
- **Created**: 2016-01-05
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#route.js
前端路由注册/解析器
[runjs演示](http://sandbox.runjs.cn/show/mg3ch4e4)
##开始
- 1引入js
```html
```
- 2注册路由
```javascript
var app=diqye.app;
app.use('/hello',function(req,next){
alert('hello')
})
app.start()
```
- 3触发路由
点击a标签``hello``
或者 直接更改浏览器地址``当前地址#hello``
###运行机制
浏览器url
1->截取#后面的路径
2->匹配第一个回调(回调顺序和调用use的顺序一致)
3->如果第一个回调调用next函数会继续匹配第二个回调 如果没有调用 回调到此结束不继续往下执行
4->如果匹配到的是路由 则进入该路由从步骤1开始执行
##例子
url:xxx#home?a=a&b=b url中的参数会被转换成json对象 存在req中的query属性
```javascript
use('/home',function(req,next){
//调用next会继续匹配后面的路由
console.log(req.query)// 输出 {"a":"a","b":"b"}
})
```
url: xxx#test/id001
```javascript
var get=diqye.route.get;
use('/test/:string',function(req,next){
//调用next会继续匹配后面的路由
console.log(req.para)// 输出 id001
});
use('/test*',function(req){
//do .....
});
```
url: xxx##homediqyeddddd 正则匹配路由
```javascript
use(/(.*)diqye(.*)/g,function(req,next){
console.log(req.para); //输出 ["/homediqyeddddd", "/home", "ddddd", index: 0, input: "/homediqyeddddd"]
});
//get函数的第一个参数也可以是 函数 根据函数的返回值来判断路由是否匹配
```
404
```javascript
//前面没有参数代表匹配所有路由
use(function(req,next){
//把这个函数放到最后 如果前面所有的路由没有匹配到 会走到这里
});
```
next函数说明
```
每一个路由(即调用get函数)都是一个拦截器
每一个拦截器中的next函数只能执行一次后续执行无效 但不报错
next可以传一个参数0 即从头开始执行拦截器并且忽略本身拦截器
```
路由跳转和内部转发
```javascript
use('/',function(req,next){
if(t){
//url跳转
req.redirect('diqye',{a:'我是首页redirect过来的',b:'ww'});
t=false;
}else{
/*
内部转发
forword会自动调用next函数
在forword后面调用next函数会无效 但不会报错
*/
req.forword('diqye',{a:'我是首页forword过来的',b:'ww'});
}
});
```
创建路由和使用
```javascript
var use=diqye.app.use;
var route=diqye.routefn();
var route1=diqye.routefn();
use(route);
use(function(req,next){
console.log('app use')
next();
})
route1.use(function(req,next){
console.log('route1 use '+req.path);
next();
})
route.use(route1)
route.use(function(req,next){
console.log('route use '+req.path);
next();
});
diqye.app.start();
```
输出
route1 use /hello
route use /hello
app use
over
build.js 说明
```shell
//命令行 切换到当前目录
node build.js //将src目录文件 按照名字规则合并到js目录里
node build.js watch //与上面不同的是 会监控src目录 有变化就执行合并操作
```