NodeJS项目基础结构简单介绍
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NodeJS项目基础结构简单介绍相关的知识,希望对你有一定的参考价值。
参考技术A按照常规,去执行npm start
或者在Terminal中手动输入命令,结果如下:
可以看到是执行了test/package.json文件中的 start 命令,初始packagejson.json文件内容如下:
执行 start ,对应的命令为 node ./bin/www 并在命令行执行。现在项目已经启动成功了,可以打开浏览器输入 localhost:3000 查看一下,但是本次侧重点在于项目启动时候发生的完整的过程。所以……
那么我们需要看一下 ./bin/www 文件
通过 require() 来引入本地安装的包,这里加载了三个包 app、debug 、http ,主要关注一下app.js
可以看到app加载的为该项目基础组件,核心为 var app = express(); 看一下express.js
将app用到的中间件等暴露出来,所以 app = express() 实际上就是加载应用基础组件,生成项目的根节点(当然这个节点是复合的)。所以在app.js中,进行的是加载应用基础组件并进行应用设置初始化(包含了视图目录设置、页面模板引擎设置、中间件的设置、静态资源目录设置以及错误捕捉相关内容)。
继续回到 www.js ,同样将debug配置、http相关组件进行加载。继而是默认端口号的设定。通过http.createServer(app),创建应用服务相关信息,并对端口进行监听。
浏览器输入 localhost:3000
控制台显示:
说明在以 GET 方式请求URI为 "/" 的资源,并以 GET 方式请求 /stylesheets/style.css 资源,这个发生在app.js中我们设定的资源请求。
我们来看下 ./routes/index 文件
即定义网站主页的路由
使用 express.Router 类创建模块化、可挂载的路由句柄(简称:路由模块)。Router 实例是一个完整的中间件和路由系统。最终,在应用中加载路由模块app.use(\'/\', indexRouter);
通过 res.render 对视图进行渲染,上述为对index.ejs的渲染。 ps:在app.js中已经设定了views的所在目录 。语法: res.render(view [,locals] [,callback])
示例:
区别:路由句柄
为请求处理提供多个回调函数,其行为类似 中间件 。唯一的区别是这些回调函数有可能调用 next(\'route\') 方法跳至下一个同路由的回调函数而略过其他路由回调函数。路由句柄有多种形式,可以是一个函数、一个函数数组,或者是两者混合。
使用一个回调函数处理路由:
使用多个回调函数处理路由(记得指定 next 对象):
使用回调函数数组处理路由:
混合使用函数和函数数组处理路由:
区别:路由方法
一个路由示例:
路由方法源于 HTTP 请求方法,和 express 实例相关联。
获取express的一个实例 app ,通过路由方法(和HTTP请求对应),GET方式请求 "/"。详细的路由方法参考链接: 路由方法
0x nodejs火焰图工具试用
昨天有大概介绍多0x 火焰图,以下是一个简单的试用
环境准备
- 项目结构
├── README.md
├── ab.sh
├── app.js
├── package.json
└── yarn.lock
- 代码说明
flame script 为使用flamebearer 工具,all-in-one 为使用0x
pacakge.json
{
"name": "nodejs-flame-graph",
"version": "1.0.0",
"main": "app.js",
"license": "MIT",
"scripts": {
"start": "node --perf-basic-prof-only-functions app.js",
"pprof": "node --prof app.js",
"all-in-one":"0x app.js",
"flame": "node --prof-process --preprocess -j isolate*.log | flamebearer"
},
"dependencies": {
"express": "^4.14.1",
"fast-levenshtein": "^2.0.6"
},
"devDependencies": {
"0x": "^4.9.1",
"flamebearer": "^1.1.3"
}
}
app.js 一个express 代码
//app.js
const express = require(‘express‘);
const console = require(‘console‘);
const levenshtein = require(‘fast-levenshtein‘);
var arr=[];
const HOW_OBVIOUS_THE_FLAME_GRAPH_SHOULD_BE_ON_SCALE_1_TO_100 = 10;
?
const someFakeModule = (function someFakeModule () {
return {
calculateStringDistance (a, b) {
return levenshtein.get(a, b, {
useCollator: true
})
}
}
})()
?
const app = express();
?
app.get(‘/‘, (req, res) => {
res.send(`
<h2>Take a look at the network tab in devtools</h2>
<script>
function loops(func) {
return func().then(_ => setTimeout(loops, 20, func))
}
loops(_ => fetch(‘api/tick‘))
</script>
`)
});
?
app.get(‘/api/tick‘, (req, res) => {
arr.push({name:‘Shubham‘});
Promise.resolve(‘asynchronous flow will make our stacktrace more realistic‘.repeat(HOW_OBVIOUS_THE_FLAME_GRAPH_SHOULD_BE_ON_SCALE_1_TO_100))
.then(text => {
const randomText =Math.random().toString(32).repeat(HOW_OBVIOUS_THE_FLAME_GRAPH_SHOULD_BE_ON_SCALE_1_TO_100)
return someFakeModule.calculateStringDistance(text, randomText)
})
.then(result => res.end(`result: ${result}, ${arr.length}`))
});
?
app.get(‘/api/end‘, () => process.exit());
?
app.listen(8080, () => {
console.log(`go to http://localhost:8080/ to generate traffic`)
});
ab.sh 简单压测的
#!/bin/sh
?
ab -n 2000 -c 100 http://localhost:8080/api/tick
启动&&效果
- 启动
yarn
yarn all-in-one
- 停止(ctrl+c) 查看效果
生成内容
火焰图
说明
0x 运行的配置选项还是挺多的,功能很强大
参考资料
https://github.com/davidmarkclements/0x
https://github.com/mapbox/flamebearer
https://github.com/rongfengliang/nodejs-flamegraph-learning
以上是关于NodeJS项目基础结构简单介绍的主要内容,如果未能解决你的问题,请参考以下文章