Nodejs项目初期架构如何搭建
Nodejs项目初期架构如何搭建
一个北美项目,大概的技术末节介绍:
- 前台用 jQuery + bootstrap 2.3.2 + Angularjs 1.0.8 实现单页应用
- 后台用 Nodejs + express
- dev/production/test 环境包括静态资源拼合压缩编译用 grunt 集成,跑测试用的 mochaTest
- 数据库用 mongodb
- 模板引擎用 jade
- 邮件发送用 nodemailer (gmail 转发,套邮件模板用了 underscore 的 templet,改写成 mustache 的语法配置)
- 服务器是 Linode
- 管理服务用 Kirua (比 forever 更小巧,但是对于多个应用中, Nginx 的 proxy 没跑通,没去细研)
- 发布用 mina (current 的软连接指向到新版本不生效,索性每次发布用 mina task 生成一个 nginx.conf 文件替换掉线上,再 restart)
- 静态资源的代理, Gzip 用 nginx
- 图片存储本来用 blueimp 及 middleware 自己实现本机存储,后来发现 mina 发布需要 clone 的分支要管理这个图片目录共享的问题,后来索性改成了 cloudinary 云存储
- 客服对话模块就没再用 websocket 来造轮子,直接用了 cloark
- 评论模块亦如此,直接用了成熟的 Disqus
- 支付用 paypal, 走的 classicApi,源于 restfulApi 未对大陆开放
- 代码托管在 github 私有仓库
开发机是 Mac,不解释。
希望找人和我一起 Remote 办公,我 base 杭州 - ( scott at moveha.com )
Node.js 项目初期架构如何搭建
在构建一个 Node.js 项目时,初期的架构设计非常关键。以下是一个基于上述技术栈的初期架构搭建指南,并附带一些示例代码。
1. 初始化项目
首先,我们需要初始化一个新的 Node.js 项目,并安装所需的依赖包。
mkdir my-node-app
cd my-node-app
npm init -y
npm install express jade nodemailer mongoose grunt-cli mocha --save
2. 项目结构
一个良好的项目结构能够帮助我们更好地组织代码。以下是推荐的项目结构:
my-node-app/
├── config/
│ └── db.js
├── controllers/
│ └── userController.js
├── models/
│ └── userModel.js
├── routes/
│ └── userRoutes.js
├── views/
│ └── index.jade
├── public/
│ ├── css/
│ └── js/
├── tests/
│ └── userTests.js
├── Gruntfile.js
└── server.js
3. 配置文件
在 config/db.js
中配置 MongoDB 数据库连接:
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/myapp', { useNewUrlParser: true, useUnifiedTopology: true });
module.exports = mongoose;
4. 启动服务器
在 server.js
中配置 Express 应用:
const express = require('express');
const path = require('path');
const app = express();
const mongoose = require('./config/db');
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.static(path.join(__dirname, 'public')));
// 引入路由
require('./routes/userRoutes')(app);
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
5. 路由和控制器
在 routes/userRoutes.js
中定义路由:
const express = require('express');
const router = express.Router();
const userController = require('../controllers/userController');
router.get('/', userController.getUser);
router.post('/register', userController.registerUser);
module.exports = router;
在 controllers/userController.js
中编写逻辑:
const User = require('../models/userModel');
exports.getUser = async (req, res) => {
const users = await User.find();
res.render('index', { users });
};
exports.registerUser = async (req, res) => {
try {
const newUser = new User(req.body);
await newUser.save();
res.status(201).send({ message: 'User registered successfully' });
} catch (error) {
res.status(500).send(error);
}
};
6. 测试
使用 Mocha 进行单元测试,在 tests/userTests.js
中编写测试用例:
const assert = require('assert');
const request = require('supertest');
const app = require('../server');
describe('User API', function() {
it('should register a new user', async function() {
const response = await request(app)
.post('/register')
.send({
name: 'John Doe',
email: 'john@example.com'
});
assert.strictEqual(response.status, 201);
});
});
7. 静态资源管理和发布
使用 Grunt 进行静态资源管理和自动化任务。在 Gruntfile.js
中配置 Grunt 任务:
module.exports = function(grunt) {
grunt.initConfig({
uglify: {
options: {
mangle: false
},
my_target: {
files: {
'public/js/app.min.js': ['public/js/*.js']
}
}
},
cssmin: {
target: {
files: {
'public/css/app.min.css': ['public/css/*.css']
}
}
}
});
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.registerTask('default', ['uglify', 'cssmin']);
};
通过以上步骤,你可以搭建一个基本的 Node.js 项目架构。每个部分都有详细的配置和代码示例,可以根据具体需求进行调整。
板凳,啥方向的?
地板
对于我来说,有点难度,不过还要顶一个
对于一个基于Node.js的项目,初期架构设计是非常重要的一步。下面我会列举一些关键组件和它们的作用,并提供相应的示例代码来帮助理解。
目录结构
首先,定义项目的目录结构,这有助于保持代码的整洁性和可维护性。例如:
/project-root
/config // 存放配置文件
/controllers // 控制器层
/models // 数据模型
/routes // 路由定义
/services // 业务逻辑层
/views // 视图(如果使用模板引擎)
/public // 静态资源
/tests // 测试文件
app.js // 应用入口文件
package.json // 项目依赖声明
初始化项目
创建package.json
文件并安装必要的依赖包。可以通过运行npm init
命令来初始化,并使用以下命令安装常用的库:
npm install express mongoose jade nodemailer grunt-cli mocha --save
Express设置
接下来,我们将创建一个简单的Express应用作为项目的入口点 (app.js
)。
const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
// 连接MongoDB数据库
mongoose.connect('mongodb://localhost/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });
// 创建Express应用
const app = express();
// 使用body-parser中间件
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
// 设置视图引擎为Jade
app.set('view engine', 'jade');
// 定义路由
app.get('/', (req, res) => {
res.send('Hello World!');
});
// 启动服务器
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
Grunt配置
创建Gruntfile.js
以集成前端任务,如压缩、合并等。一个基本的配置可能如下所示:
module.exports = function(grunt) {
// 项目配置。
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
uglify: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
},
build: {
src: 'src/<%= pkg.name %>.js',
dest: 'build/<%= pkg.name %>.min.js'
}
}
});
// 加载包含 "uglify" 任务的插件。
grunt.loadNpmTasks('grunt-contrib-uglify');
// 默认任务。
grunt.registerTask('default', ['uglify']);
};
环境变量
确保在不同的环境中使用不同的配置,可以利用环境变量或者.env
文件来区分开发、测试和生产环境。
通过这些步骤,您可以开始构建一个基本的Node.js项目结构。随着项目的增长,您将需要扩展此基础,添加更多的功能和服务。