Nodejs相关:Ember.js + Express.js 的疑问

Nodejs相关:Ember.js + Express.js 的疑问

新人,刚刚学习了一下Node.js。做完一个小Demo(express + ejs + mongoose),然后我无意间查资料找到了Ember.js。现在有点迷茫,希望给位大大解惑一下。

首先谈谈认识: express 是 sever-side MVC。 ember 是 client-side MVC,并只带模板引擎 HandlebarsJS。 在网上偶尔查到有外国人说有这种组合 ember + express ember负责前端的UI express负责后端 呈现这种层次:

ember – 前台UI | express – 后台 数据请求处理 | mongoose/其他数据接口

这样做的场合比较适合 web app(UI + 数据服务 类似WebQQ的rich-client 或者 仅仅ember 已经能完全应付)? 如果只是做RESTful API 服务express已经足够了 自己做的demo已经实现, 简单轻量级的web也能应付。

请问这两种都是framework 能整合到一起么?都有路由功能如何整合?在社区里搜索貌似没有结果。。。


3 回复

当然可以!让我们详细探讨一下 Ember.jsExpress.js 的结合使用,以及它们如何协同工作。

Ember.js 和 Express.js 结合的背景

Express.js 是一个简洁而灵活的 Node.js Web 应用框架,提供了一系列强大的特性来开发 Web 应用。它主要用于后端逻辑处理、数据存储和API构建。

Ember.js 是一个用于创建可扩展的单页应用(SPA)的JavaScript框架。它自带路由、模板引擎和其他高级功能,使得前端开发更为高效。

如何整合 Ember.js 和 Express.js

1. 项目结构

你可以将项目分为前后端两部分:

  • 前端: 使用 Ember.js 构建用户界面。
  • 后端: 使用 Express.js 提供 RESTful API 和数据处理。

2. 项目文件结构

my-app/
├── frontend/               # Ember.js 项目
│   ├── app/                # Ember.js 应用源码
│   └── ember-cli-build.js  # Ember.js 配置文件
└── backend/                # Express.js 项目
    ├── routes/             # API 路由
    ├── models/             # 数据模型
    ├── controllers/        # 控制器
    └── server.js           # 主入口文件

3. Express.js 配置

server.js 中配置基本的 Express.js 服务器,并设置静态文件服务,以便 Ember.js 的构建输出可以被正确访问。

const express = require('express');
const path = require('path');

const app = express();

// 设置静态文件目录
app.use(express.static(path.join(__dirname, '../frontend/dist')));

// 定义API路由
app.get('/api/data', (req, res) => {
    res.json({ message: 'Hello from Express!' });
});

// 捕获所有未匹配的路由,返回前端的index.html
app.get('*', (req, res) => {
    res.sendFile(path.join(__dirname, '../frontend/dist/index.html'));
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

4. Ember.js 配置

确保 Ember.js 生成的文件位于 frontend/dist 目录中。你可以在 ember-cli-build.js 中配置输出路径。

module.exports = function(defaults) {
  let app = new EmberApp(defaults, {
    // 其他配置...
  });

  return app.toTree();
};

总结

通过这种方式,你可以利用 Express.js 处理数据请求和API,同时使用 Ember.js 来处理复杂的前端逻辑和视图。这样的架构非常适合需要高度交互性和复杂前端逻辑的Web应用,例如Web QQ这样的富客户端应用。而对于简单的RESTful API服务,单独使用 Express.js 就已经足够了。

希望这些信息对你有所帮助!如果你有更多的问题或需要进一步的解释,请随时提问。


路由处理针对的情况不同,express根据这个路由规则,解析出controll和action,然后事件循环调用回调函数处理请求,我用的angular.js没有用过route,

Ember.js 和 Express.js 可以很好地结合使用,分别负责前端和后端的开发工作。以下是一些关键点来帮助你理解这种组合方式:

Ember.js 的角色

  • 客户端 MVC 框架:Ember.js 主要用于构建复杂的单页应用(SPA),负责前端的用户界面和用户体验。
  • 模板引擎:Ember 使用 Handlebars 作为其模板引擎。

Express.js 的角色

  • 服务器端框架:Express.js 用于处理后端逻辑、数据处理以及 RESTful API 的创建。
  • 路由功能:Express 提供强大的路由功能来处理各种 HTTP 请求。

整合思路

1. 分离前后端

  • 前端:Ember.js 负责处理所有前端的 UI 渲染和用户交互。
  • 后端:Express.js 负责处理 API 请求,返回 JSON 数据。

2. API 接口设计

假设你的 Express 应用提供一个 /api/users 的 API 来获取用户列表:

// expressApp.js (后端)
const express = require('express');
const app = express();

app.get('/api/users', (req, res) => {
    // 假设这是从数据库获取的数据
    const users = [
        { id: 1, name: 'Alice' },
        { id: 2, name: 'Bob' }
    ];
    res.json(users);
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

3. 前端请求

Ember.js 可以通过 AJAX 请求与 Express 后端进行通信:

// emberApp/app/routes/users.js (前端)
import Route from '@ember/routing/route';
import fetch from 'fetch';

export default class UsersRoute extends Route {
  async model() {
    const response = await fetch('/api/users');
    const users = await response.json();
    return users;
  }
}

前后端的路由配置

  • Express.js 配置 HTTP 路由,处理来自浏览器的 API 请求。
  • Ember.js 配置前端路由,管理 SPA 中的不同页面。

示例:Ember.js 路由配置

// emberApp/app/router.js (前端)
import Router from '@ember/routing/router';

Router.map(function() {
  this.route('users');
});

总结

Ember.js 和 Express.js 的组合非常适合需要复杂前端交互和高性能后端支持的应用场景。通过明确分工,可以有效地利用各自的优势来构建现代 Web 应用。

这种方式适合于需要复杂用户界面和大量前端交互的项目,例如富客户端应用(如 WebQQ)。如果只是为了简单的 RESTful API 服务,那么仅使用 Express.js 就足够了。

回到顶部