在ExpressJS构建中构建Assemble.io前端

时间:2016-04-03 02:23:27

标签: node.js twitter-bootstrap mongodb assemble

请耐心等待,目前正在学习以下技术。

我构建了一个基本的应用程序,包括NodeJS + ExpressJS + MongoDB + Monk + Jade构建。我打算用Handlebars取代Jade,这是一种不同的模板引擎。为了解决这个问题,我正在考虑实现Assemble.io,因为它是一个使用Handlebars的静态站点生成器,它为使用Bootstrap前端框架开始构建奠定了良好的基础。我也喜欢Assemble很好地将文件分成布局,模板和局部文件。

此应用程序/网站的目标是从MongoDB中提取数据并将其显示在前端。前端将包含100个不同的内容页面,因此它们需要易于维护。当然,我还需要与前端和后端代码明确区分。

建立这样的东西最合乎逻辑的方法是什么?可以用ExpressJS实现Assemble吗?如果是这样,我如何在app.js中设置我的视图以显示汇编文件?或者将view engine设置为把手并将CDN链接引入Bootstrap会更好吗? (但如果我这样做,我将如何设置布局,模板和部分?)

1 个答案:

答案 0 :(得分:1)

您可以采取一些不同的方法。

  1. 在构建时使用汇编预渲染页面结构。然后使用前端javascript加载数据并呈现动态内容。
  2. 使用服务器端控制器中的汇编api加载模板和数据,并在运行时呈现内容。
  3. 与(2)类似,覆盖express中的内置View类,并使用汇编进行加载和渲染。
  4. 我现在可以使用#2,因此您可以直接使用汇编api来加载app.js中的模板,数据,助手,中间件等。然后创建一个render函数,您可以在路径中使用该函数来获取页面并渲染它......

    var express = require('express');
    var Assemble = require('assemble');
    
    var app = express();
    var assemble = new Assemble();
    
    // setup middleware
    assemble.onLoad(/\.hbs/, function(file, next) {
      // so something if needed
      next();
    });
    
    // load helpers
    assemble.helpers(['path/to/helpers/*.js']);
    // load async helpers
    assemble.asyncHelpers(['path/to/async-helpers/*.js']);
    
    // load templates
    assemble.layouts(['path/to/layouts/*.hbs']);
    assemble.partials(['path/to/partials/*.hbs']);
    assemble.pages(['path/to/pages/*.hbs']);
    
    // load global site data
    assemble.data(['path/to/site.json']);
    
    // render function to make looking up and rendering pages easier
    function render(name, locals, cb) {
      var view = assemble.getView(name);
      if (!view) return cb(new Error('Unable to find "' + name + '"'));
      view.render(locals, function(err, result) {
        if (err) return cb(err);
        cb(null, result.content);
      });
    }
    
    // setup some express routes
    app.get('/', function(req, res, next) {
      render('index', {title: 'Home Page'}, function(err, content) {
        if (err) return next(err);
        res.status(200); // I don't remember this api off the top of my head
        res.send(content);
      });
    });
    

    希望这有帮助。