(摘) Algernon全功能Web服务器

声明:内容源自网络,版权归原作者所有。若有侵权请在网页聊天中联系我

Pi上挂载了四个Web服务器,其中三个是自己做的,想把它合并,做简单一些。另外,希望Web能支持Markdown文件。于是网上搜到了Algernon,它是支持Markdown的,试试看。

拉回代码可以自己交叉编译,arm上运行没问题。而且,它是单一文件运行。

Algernon(阿尔杰农)内置了HTTP/2,Lua,Markdown,Pongo2,HyperApp,Amber,Sass(SCSS),GCSS,JSX,BoltDB的功能,支持 Redis,PostgreSQL,MariaDB / MySQL数据库。支持限速,插件,用户和权限等各种功能。所有这些都包含在一个自包含可执行文件中,麻雀虽小五脏俱全。

支持HTTP,HTTP/2,默认启动HTTPS

支持Lua动态程序,可以使用Lua脚本处理程序

支持热部署自动刷新功能,实时编辑/实时预览

完全多线程。将使用所有可用的CPU。

这儿有篇文章介绍,网上的文章并不多。

功能看似很强,可以下载示例学习学习

使用下来,它的内容不会马上更新,而是有缓存,至于多久更新,暂不得知。

algernon –httponly –autorefresh –dir=. 只使用http协议,自动刷新. 注意最后小点,表示以本目录作为根目录

algernon –help 参数看起来还是满丰富的。


我下载了它的示例

示例 welcome

Markdown渲染:index.md

它默认渲染index.md文件作为首页,style.gcss作为样式。

** 科普: GCSS 是纯 Go 语言实现的 CSS 预处理器 ? **

md文件中title可以指定页面的标题。这适合一些简洁的页面输出。

通过目录可以看到:相同页面下虽然有其它md文件,但默认是输出index.md作为首页的。

### 示例 greetings

在welcome的子示例greetings中,看到了奇怪的输出。

index.md

title: Styled Markdown

Greetings
---------

* How
* are
* you

style.gcss

@import url(//fonts.useso.com/css?family=Monoton|Monofett)

html
  background-color: #222

body
  color: #111
  background-color: #999
  font-family: Monofett, cursive
  font-size: 2em
  margin: 2.7em
  padding: 0 5em 1em 2em
  border-radius: 50px
  border: solid 10px #a00
  box-shadow: 10px 10px 16px black, 6px 6px 8px #222 inset
  display: inline-block

h2
  font-family: Monoton, cursive
  color: black

ul
  margin-left: 1em

li
  list-style: none

li:hover
  color: #d00

md文件很普通,看起来它是通过标准的样式名称,定义相应的样式来达到不同的显示效果。所以关键在于css文件。

示例 TODO

这也是welcome的子示例。它的index文件为index.amber

我在网上没有百度到amber扩展名是何意。似乎是一个模板。

“Amber和GCSS是时下静态网站的最佳组合方式,与HTML和CSS相比,它允许更清晰的架构,减少内容重复,也很容易使用Lua提供数据,支持MVC架构对模型(M),控制器(C)和视图(V)的更好的分割。”

“amber用于Amber模板”

”index.amber渲染为HTML的Amber代码“

index.amber

doctype 5
html
  head
    title TODO
    script[src="//fb.me/react-0.13.2.js"]
  body
    div[id="content"]
    script[src="todo.jsx"]

看网页源代码,它渲染成了这样

<!DOCTYPE html>
<html>
	<head>
		<link href="style.gcss" rel="stylesheet" type="text/css" />
		<title>TODO</title>
		<script src="//fb.me/react-0.13.2.js"></script>
	</head>
	<body>
		<div id="content"></div>
		<script src="todo.jsx"></script>
	<script> if (!!window.EventSource) {	 window.setTimeout(function() { var source = new EventSource(window.location.protocol + '//127.0.0.1:5553/sse'); source.addEventListener('message', function(e) { const path = '/' + e.data; if (path.indexOf(window.location.pathname) >= 0) { location.reload() } }, false);	 }, 244);	} </script></body>
</html>

它在下载一个react.js库(用于构建用户界面的 JavaScript 库),版本过旧,下载没成功。最新版本都16.13.1了。

好不容易在网上找到一个,对index做了修改

doctype 5
html
  head
    title TODO
    script[src="//cdn.bootcdn.net/ajax/libs/react/0.13.2/react.js"]
  body
    div[id="content"]
    script[src="todo.jsx"]

或者下载到本地

doctype 5
html
  head
    title TODO
    script[src="./react-0.13.2.js"]
  body
    div[id="content"]
    script[src="todo.jsx"]

其实我还试了最新版本,显示不成功。

跳过样式文件style.gcss,直接看脚本todo.jsx

// The TODO example from http://facebook.github.io/react/

var TodoList = React.createClass({
  render: function() {
    var createItem = function(itemText, index) {
      return <li key={index + itemText}>{itemText}</li>;
    };
    return <ul>{this.props.items.map(createItem)}</ul>;
  }
});
var TodoApp = React.createClass({
  getInitialState: function() {
    return {items: [], text: ''};
  },
  onChange: function(e) {
    this.setState({text: e.target.value});
  },
  handleSubmit: function(e) {
    e.preventDefault();
    var nextItems = this.state.items.concat([this.state.text]);
    var nextText = '';
    this.setState({items: nextItems, text: nextText});
  },
  render: function() {
    return (
      <div>
        <h3>TODO</h3>
        <TodoList items={this.state.items} />
        <form onSubmit={this.handleSubmit}>
          <input onChange={this.onChange} value={this.state.text} />
          <button>{'Add #' + (this.state.items.length + 1)}</button>
        </form>
      </div>
    );
  }
});

React.render(<TodoApp />, document.getElementById('content'));

看不太懂,主要是在首页面上添加了一些内容。在点击按钮的时候进行显示,没有涉及到保存,即刷即丢。

以上示例可以看到,index文件相当简单,大部份功能由后端脚本(todo.jsx)来完成。

amber有点象markdown,通过一些标识来定义内容。

示例 lua

此服务器支持lua脚本,甚至服务器运行时也显示在脚本状态下

这个示例很简单,index.lua文件默认渲染为首文件。在页面上输出Helo Lua

print("Hello, Lua!")

Lua 是一种轻量小巧的脚本语言,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。常用于游戏脚本,Web脚本等。有些单片机上也有它。

当前最新版5.4,下载341KB。小得有点不好意思。

示例 浏览计数器

index.amber

doctype 5
html
  head
    title #{title}
  body
    h1 #{title}
    div#content
      p Page views: #{counter()}

data.lua

title = "Counter Example"

-- Count from 1 and up. Return the current value.
function counter()
  -- Use the "pageview" KeyValue and increase the "counter" value with 1
  return KeyValue("pageview"):inc("counter")
end

这个index如何知道调用哪个lua呢?指定为data.lua?

相关文章