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项目基础结构简单介绍的主要内容,如果未能解决你的问题,请参考以下文章

HBase简单介绍

前端基础HTML 简单介绍

maven的简单介绍

使用nodeJS实现前端项目自动化之项目构建和文件合并

NodeJs的简单介绍

nodejs简单介绍