zerojs是一个基于nodejs、angularjs、git的CMS。在它之上可以继续开发出博客、论坛、wiki等类似的内容管理型系统。

  • 拥抱开发者和社区
    • 层次清晰,高度解耦。前后端即使分开也都是完全可独立运行的系统。
    • 每一个层次都是用当前业界最流行的工具和方法作为底层,对开发者来说几乎无学习成本。
    • 模块、主题、套件体系简单成熟,二次开发没有坑。

后端架构

zerojs 底层基于 sails。继承了 sails 三大优势:

  • 强大的 Model 层。sails实现了自己的ORM,接口几乎和 mongoose 完全一致,简单易用。配合上社区统一的数据库驱动,可完美支持mongo、mysql、redis、postgreSQL等等数据库。ORM封装完善,设置可以对单个model指定使用的数据库。
  • 为model提供全自动的RESTful接口。实现声明即可用。
  • controller 和 view 完全基于express实现,无附加学习成本。

zerojs 的核心层包含了CMS最通用的功能,特点有三:

  • 内容管理功能强大。zerojs为"内容节点","分类与标签"等核心概念建立了统一的抽象,为继承者统一提供索引、摘要等功能。同时系统仍然非常开放,允许开发者声明普通的model,然后通过mixin的方式使用部分功能。
  • 系统可扩展性高。几乎在每个流程的关键动作处都使用了hook来支持扩展。例如“增、删、改、查”的前前后后。同时在系统操作(例如记录统计数据)处都采用了选择driver的方式来支持适合开发者的需求。
  • 对前端前无古人的友好。原生支持传统模板渲染、前端MVVM框架渲染及混合渲染等多种方式。系统默认提供一整套angular模块(包括登陆、注册、节点增删改查等)给开发者随意组合使用,可实现几乎 0 代码的情况下将前端变成单页应用。工程化问题(如静态资源的压缩打包)由系统自动根据当前环境完成。

zerojs 的扩展层基于git实现,优势:

  • 代码安全有保障,不会搞挂系统。
  • 一键即可在当前开发环境打包自己开发的新功能。无需手动整理。

以下是一个基于zerojs打造的博客系统基础模块示意图:

前端架构

前面已经提到 zerojs 对前端提供的全部都是标准的 REST 接口,并且在 view 的渲染上支持多种方式。意味着前端完全可以自主开发,甚至完全抛弃掉服务器端的view层,不在同一环境也可以。这里讲的前端架构,主要是指zerojs默认提供的angular的前端架构。下面分三个前端最关心的问题来讲:

一、如何使用默认前模块?

zerojs 为"用户、节点、标签、统计"等每一个主要功能都提供了一整套完善的angular模块,并且都有默认的controller。很多时候,例如新增一种节点类型如“日记”,开发者需要做的仅仅是非常简单的三步:

  1. 在后端声明一下这个类型。
  2. 前端引入文件,
  3. 然后写前端的模板文件就够了。

即使要增加字段,都只要写模板就够了。默认模块已经经过了各种场景的锤炼,功能非常完善。如果你真是遇到非常特别,一定要自己手动处理的地方,那你仍然可以大量复用默认模块的service、filter等等。几乎所有功能都被封装到了service里。 非常值得注意的时,这些默认模块和zerojs的后端没有任何耦合!这意味着即使你要完全换成自己的后端,只要接口标准,那么这些模块也都是可用的。

二、如何处理预加载的数据?

在做单页应用的时候,常常为了节省请求、加速第一屏显示速度而把让服务器端提前把一些数据直接渲染在页面上,例如"当前用户的基本信息","第一屏数据"等。zerojs在处理view的时候,遇到"渲染单个节点"、"渲染节点列表"都会默认将节点内容直接渲染到页面上,在angular中,引入系统默认提供的preload模块即可获取到这些数据。不过仍然不用太操心,系统提供的节点增删改查、列表渲染、单个节点渲染等默认angular模块都已经自动支持使用preload数据了。开发者还是只要正常写模板就好。

三、前端脚本的模块依赖、打包压缩等如何处理?

这些问题都是工程问题,zerojs在生产环境会分析模板然后统一打包再注入到模板中。未来在view层可能会推出CDN模块,对前端更友好!

下面是一个基于zerojs打造的博客系统,当然,毫不客气地说要成为博客中的王者。

http://www.cnblogs.com/sskyy/p/3918299.html

zerojs! 造出最好的 CMS 轮子的更多相关文章

  1. 造出最好的 CMS 轮子

    zerojs! 造出最好的 CMS 轮子 zerojs是一个基于nodejs.angularjs.git的CMS.在它之上可以继续开发出博客.论坛.wiki等类似的内容管理型系统. 拥抱开发者和社区 ...

  2. 使用Python管理数据库

    使用Python管理数据库   这篇文章的主题是如何使用Python语言管理数据库,简化日常运维中频繁的.重复度高的任务,为DBA们腾出更多时间来完成更重要的工作.文章本身只提供一种思路,写的不是很全 ...

  3. Lucene.net 的性能探究--Lucene.net 的并发处理能力到底有多强?

    这篇博客并不是证明Lucene.net的性能有多强悍,实际上Lucene.net的并发能力并不让人很满意,这得看你怎么用它. 因为Lucene 本身就是一个搜索引擎的基础框架,相当于一辆车子的发动机, ...

  4. 开发自己的山寨Android注解框架

    目录 开发自己的山寨Android注解框架 开发自己的山寨Android注解框架 参考 Github黄油刀 Overview 在上一章我们学习了Java的注解(Annotation),但是我想大家可能 ...

  5. PHP-PSR 现代PHPer的开发规范

    PSR是PHP Standards Recommendation的简称,意为PHP推荐标准.要想了解PSR,首先得知道制定这一标准的人/组织是谁————PHP-FIG. PHP-FIG PHP-FIG ...

  6. Hadoop就是一个别人造好的轮子

    这个想法源自于我看了<Hadoop: The Definitive Guide>的Part I Ch 2中MapReduce的引入和介绍,书中先说了怎么通过原始的办法处理数据,然后引入到如 ...

  7. 用Vue自己造个组件轮子,以及实践背后带来的思考

    前言 首先,向大家说声抱歉.由于之前的井底之蛙,误认为Vue.js还远没有覆盖到二三线城市的互联网小厂里.现在我错了,从我司的前端技术选型之路便可见端倪.以太原为例,已经有不少公司陆续开始采用Vue. ...

  8. 如何合理封装你的轮子、飞机、大炮(以封装OkHttp为例)

    前言 对于程序员来说,很多时候,我们都在造房子,从学会框架或者是学会构建整个项目之后,慢慢的我们就会觉得自己在做的事情是一种重复劳动,很多时候只不过是换个面孔而已.而更快的造房子,造好看的房子可能是进 ...

  9. 除非你是BAT,前端开发中最好少造轮子

    站在前人的肩膀上 HTML.CSS.JavaScript是前端的根基,这是无可否认的事实.正如一辆车当然都是由一堆钢板和螺钉组成的,但是现在还有人拎着个锤子敲敲打打的造车吗?李书福说过,“汽车不过是四 ...

随机推荐

  1. 【BZOJ2073】[POI2004]PRZ 状压DP

    [BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...

  2. 《Linux内核设计与实现》读书笔记 第一、二章

    第一章    Linux内核简介 1.1Unix历史 Unix特点:1.很简洁 2.所有东西都被当成文件对待 3.Unix内核和相关的系统工具软件都是用C语言编写而成 4.进程创建非常迅速 所以Uni ...

  3. 在集群上运行caffe程序时如何避免Out of Memory

    不少同学抱怨,在集群的GPU节点上运行caffe程序时,经常出现"Out of Memory"的情况.实际上,如果我们在提交caffe程序到某个GPU节点的同时,指定该节点某个比较 ...

  4. html系列教程--article audio

    <article> 标签 <article> 标签规定独立的自包含内容.一篇文章应有其自身的意义,应该有可能独立于站点的其余部分对其进行分发. <article> ...

  5. Linux shell的问题

    1.uptime命令可以查看当前系统的启动时间: w命令显示当前登录者top命令显示当前任务ps命令显示所有进程信息 uptime命令可以查看系统启动时间   2.使用shell时,默认的环境变量放在 ...

  6. vue2.0 技巧汇总

    /** * Created by */ export default { trim: (str) => { //删除左右两端的空格 return str.replace(/(^\s*)|(\s* ...

  7. 【APP测试(Android)】--性能测试

  8. C#中IEnumerable、ICollection、IList、IQueryable 、IQueryable 、List之间的区别

    一:一个简单的例子 int[] myArray = { 1, 32, 43, 343 }; IEnumerator myie = myArray.GetEnumerator(); myie.Reset ...

  9. spfa负环判断

    正常spfa中加入time数组,循环判断一个点是否入队并更新了n次以上注意是 > n!!其余的没有什么问题 扩展的还有,寻找所有负环上的点,这个可以在spfa中time 发现负环的时候,对那个点 ...

  10. Python3.5 学习十七

    jQuery 模块=类库 jQuery就是DOM .BOM.Javascript的封装成的类库 一.查找元素.DOM只有10种左右选择器 jQuery有很多选择器和筛选器 PS:jQuery 推荐1系 ...