编写view

简介: 编写view

编写View

在编写View的时候,我们实际上是在编写HTML页。为了让页面看起来美观大方,使用一个现成的CSS框架是非常有必要的。我们用 Bootstrap这个CSS框架。从首页下载zip包后解压,我们把所有静态资源文件放到/static目录下:

view-koa/
|
+- static/
   |
   +- css/ <- 存放bootstrap.css等
   |
   +- fonts/ <- 存放字体文件
   |
   +- js/ <- 存放bootstrap.js等

这样我们在编写HTML的时候,可以直接用Bootstrap的CSS,像这样:

<link rel="stylesheet" href="/static/css/bootstrap.css">

现在,在使用MVC之前,第一个问题来了,如何处理静态文件?

我们把所有静态资源文件全部放入/static目录,目的就是能统一处理静态文件。在koa中,我们需要编写一个middleware,处理以/static/开头的URL。

编写middleware

我们来编写一个处理静态文件的middleware。编写middleware实际上一点也不复杂。我们先创建一个static-files.js的文件,编写一个能处理静态文件的middleware:

const path = require('path');
const mime = require('mime');
const fs = require('mz/fs');
// url: 类似 '/static/'
// dir: 类似 __dirname + '/static'
function staticFiles(url, dir) {
    return async (ctx, next) => {
        let rpath = ctx.request.path;
        // 判断是否以指定的url开头:
        if (rpath.startsWith(url)) {
            // 获取文件完整路径:
            let fp = path.join(dir, rpath.substring(url.length));
            // 判断文件是否存在:
            if (await fs.exists(fp)) {
                // 查找文件的mime:
                ctx.response.type = mime.lookup(rpath);
                // 读取文件内容并赋值给response.body:
                ctx.response.body = await fs.readFile(fp);
            } else {
                // 文件不存在:
                ctx.response.status = 404;
            }
        } else {
            // 不是指定前缀的URL,继续处理下一个middleware:
            await next();
        }
    };
}
module.exports = staticFiles;


staticFiles是一个普通函数,它接收两个参数:URL前缀和一个目录,然后返回一个async函数。这个async函数会判断当前的URL是否以指定前缀开头,如果是,就把URL的路径视为文件,并发送文件内容。如果不是,这个async函数就不做任何事情,而是简单地调用await next()让下一个middleware去处理请求。

我们使用了一个mz的包,并通过require('mz/fs');导入。mz提供的API和Node.js的fs模块完全相同,但fs模块使用回调,而mz封装了fs对应的函数,并改为Promise。这样,我们就可以非常简单的用await调用mz的函数,而不需要任何回调。

所有的第三方包都可以通过npm官网搜索并查看其文档:

 https://www.npmjs.com/

最后,这个middleware使用起来也很简单,在app.js里加一行代码:

let staticFiles = require('./static-files');
app.use(staticFiles('/static/', __dirname + '/static'));

注意:也可以去npm搜索能用于koa2的处理静态文件的包并直接使用。


相关文章
|
4月前
|
小程序 前端开发 JavaScript
小程序入门之认识view和text组件
小程序入门之认识view和text组件
122 0
|
XML 数据格式 容器
View-Layout注入框架--简洁视图注入
框架开发前 在没有这套框架之前,我们在activity、fragment、自定义view、listview的viewholder甚至你能想的更多。 大概是这样: //activity protected void onCreate(Bundle savedInstanceState) { super.
974 0
|
SQL 关系型数据库 Oracle
关于inline view内嵌视图的学习
看一篇的时候碰巧看到有关inline view的概念,不太熟悉,查了下。 所谓inline view,也叫内前视图,说白了,就是执行的时候才建立的视图。
831 0
|
5月前
|
开发框架 Android开发 iOS开发
Flutte之UI编写总结
Flutte之UI编写总结
Render在View页面的写法
@{Html.RenderAction("GenreMenu", "Store");} @{Html.RenderPartial("HistoryList", Model);}  学习交流群:364976091
638 0
Spinner用法案例
Spinner控件也是一种列表类型的控件,它的继承关系如下:<br>java.lang.Object <br>   ↳ android.view.View <br>     ↳ android.view.ViewGroup <br>       ↳ android.widget.AdapterView&lt;T extends android.widget.Adapter&gt; <br>  
1260 0
|
容器 数据安全/隐私保护 JavaScript
View组件
一、使用方法 view组件是最常用的,也是最简单的视图容器。它是一个块级容器组件,它没有特殊的功能,主要用于布局展示,是布局中最基本的UI组件。几乎所有复杂的布局都可以通过嵌套view来实现。 view除了公共属性之外,还有以下几个私有属性 属性名 类型 默认值 说明hover-.
3061 0
|
前端开发
Ext.js细节:在MVC中处理Widget Column,GetCmp和ComponentQuery, Id和ItemId
针对EXT.JS版本的演进,要不断的学习新的最佳实践方法。 比如,在定义组件时,尽管用itemid,而不是id。 在搜索组件时,尽量用ComponentQuery,而不是getCmp. 在MVC中处理Widget Column事件时,应该自定义,而在MVVM中,ViewController 直接写: handler: 'onWidgetClick'。
1105 0
|
程序员 Android开发 容器
ButterKnife--View注入框架
Github 地址:  https://github.com/hpu-spring87/butterknife   http://www.stormzhang.com/openandroid/android/2014/01/12/android-butterknife/   俗话说:“不会偷懒的程序员不是好的程序员!”。
918 0

热门文章

最新文章