Menu

  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay
  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay

ExtJS 4的MVC框架

25
Mar
2013

ExtJS 4的MVC框架

By Alex
/ in JavaScript
/ tags ExtJS, MVC
0 Comments

ExtJS 4引入MVC架构,可以用来创建ExtJS应用程序,与经典的Ext.onReady回调方式很不相同。

MVC架构

在开发ExtJS应用时,往往习惯于把所有JavaScript代码编写在单个文件中,生产环境下的应用通常都比较复杂,可能包括了面板、表单、表格、布局、模型、存储等多种组件的组合。大量的组件代码导致JS文件急剧膨胀,难以维护,因此很有必要根据职责的不同把代码划分到不同的文件中,提高代码的可重用性。

在ExtJS 4以前的版本下,如何组织代码由开发人员自行决定,而MVC则是ExtJS 4提供的模式化选择。在ExtJS看来,MVC代表:

  1. Model:包含一系列字段、及其数据的集合,由Model类表示,亦可使用Store类来加载、保存数据
  2. View:可以是某种视觉组件,例如Grid、Tree、Form
  3. Controllers:包含了一些动作逻辑,例如用户点击按钮时需要执行的操作
老式的ExtJS应用

在这里我们先创建一个老式的ExtJS应用,并在后面尝试将其迁移到MVC架构下,以阐述ExtJS MVC的用法。

该应用包含一个GRID和一个详情面板,JavaScript代码全部放在app.js中:

app.js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
Ext.onReady( function()
{
    Ext.define( 'Book', {
        extend : 'Ext.data.Model',
        fields : [
            'id', 'title', 'pages', 'numChapters', 'topic', 'publisher', 'isbn', 'isbn13'
        ]
    } );
    var store = Ext.create( 'Ext.data.Store', {
        model : 'Book',
        proxy : {
            type : 'ajax',
            url : 'data/books.json'
        }
    } );
    var grid = Ext.create( 'Ext.grid.Panel', {
        store : store,
        title : 'Books',
        columns : [
            {
                text : "Title",
                width : 120,
                dataIndex : 'title',
                sortable : true
            }, {
                text : "Pages",
                flex : 1,
                dataIndex : 'pages',
                sortable : true
            }, {
                text : "Topic",
                width : 115,
                dataIndex : 'topic',
                sortable : true
            }, {
                text : "Publisher",
                width : 100,
                dataIndex : 'publisher',
                sortable : true
            }
        ],
        viewConfig : {
            forceFit : true
        },
        region : 'center'
    } );
    var details = Ext.create( 'Ext.panel.Panel', {
        id : 'bookDetail',
        bodyPadding : 7,
        bodyStyle : "background: #ffffff;",
        html : 'Please select a book to see additional details.',
        height : 150,
        split : true,
        region : 'south'
    } );
    var bookTplMarkup = [
        '<b>Title:</b> {title}<br/>',
        '<b>Pages:</b> {pages}<br/>',
        '<b>No Chapters:</b> {numChapters}<br/>',
        '<b>Topic:</b> {topic}<br/>',
        '<b>Publisher:</b> {publisher}<br/>',
        '<b>ISBN:</b> {isbn}<br/>',
        '<b>ISBN 13:</b> {isbn13}<br/>'
    ];
    var bookTpl = Ext.create( 'Ext.Template', bookTplMarkup );
    grid.getSelectionModel().on( 'selectionchange', function( sm, selectedRecord )
    {
        if ( selectedRecord.length )
        {
            var detailPanel = Ext.getCmp( 'bookDetail' );
            bookTpl.overwrite( detailPanel.body, selectedRecord[0].data );
        }
    } );
    Ext.create( 'Ext.container.Viewport', {
        frame : true,
        layout : 'border',
        items : [
            grid, details
        ]
    } );
    store.load();
} );

 HTML代码:

app.html
XHTML
1
2
3
4
5
6
7
8
9
10
11
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>MVC Architecture</title>
<link rel="stylesheet" type="text/css" href="extjs/resources/css/ext-all.css" />
<script type="text/javascript" src="extjs/ext-all.js"></script>
<script type="text/javascript" src="app.js"></script>
</head>
<body>
</body>
</html>
迁移/创建基于MVC的ExtJS应用

在这里我们使用MVC重新实现上一段中的应用。下图描述了JavaScript代码的目录结构:

ExtJS MVC

 我们可以看到,所有的JavaScript代码被分配在app文件夹中,它们的职责划分如下:

  1. app.js:包装整个应用程序,通常我们使用单页面方式来开发MVC应用
  2. controller:控制器类存放目录
  3. model:模型类存放目录
  4. store:存储类存放目录
  5. view:视图类存放目录
  6. data:由于本示例不合服务器交互,该目录存放JSON数据

为了使用动态加载,以下ExtJS SDK文件需要被引入到extjs目录下:

  1. ext-debug.js或者ext.js:用于ExtJS自举
  2. resources目录:包含样式定义文件
  3. src目录:包含ExtJS所有组件的源代码
创建MVC骨架程序

修改后的HTML代码如下:

app.html
XHTML
1
2
3
4
5
6
7
8
9
<head>
<title>MVC Architecture</title>
<link rel="stylesheet" type="text/css" href="exts/resources/css/ext-all.css" />
<script type="text/javascript" src="extjs/ext-debug.js"></script>
<script type="text/javascript" src="app.js"></script>
</head>
<body>
</body>
</html>

 app.js为MVC骨架,内容如下:

app.js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
Ext.require( 'Ext.container.Viewport' );
Ext.application( {
    name : 'App',   //可选的应用的名称,也在全局创建了变量App,会作为所有模型、视图、存储、控制器的名字空间
    appFolder : 'app', //应用程序组件存放位置
    controllers: ['Books'], //声明该应用使用的控制器
    launch : function() //应用创建后自动执行的动作,必须覆写
    {
        Ext.create( 'Ext.container.Viewport', {
            //所有组件均放置于该Viewport中
        } );
    }
} );
创建控制器类
controller/Book.js
JavaScript
1
2
3
4
5
6
7
8
//注意类名于目录结构限定的名字空间一致
Ext.define( 'App.controller.Books', {
    extend : 'Ext.app.Controller',
    init : function()
    {
        //在App的launch之前执行
    }
} );

控制器类继承自Ext.app.Controller,控制器负责与Store、View通信,并在特定事件发生时执行对应的Action。 

控制器的init方法在App.launch方法之前执行,可以在这里编写所有需要在创建Viewport前执行的代码,例如:

  1. 实现与视图交互的逻辑,主要是相关的事件监听
  2. 加载数据
  3. 其它业务逻辑
在控制器类中操控视图

修改上面编写的控制器为:

controller/Books.js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Ext.define( 'App.controller.Books', {
    extend : 'Ext.app.Controller',
    init : function()
    {
        this.control( {
            //对于viewport的直接子panel,监听其render事件
            'viewport > panel' : {
                render : this.onPanelRendered
            }
        } );
    },
    onPanelRendered : function()
    {
    }
} );

使用control方法可以注册对视图组件生命周期的监听器,在这里,我们监听Viewport子面板的render事件。 

创建模型、存储类

模型类:

model/Book.js
JavaScript
1
2
3
4
5
6
7
//注意类名于目录结构限定的名字空间一致
Ext.define( 'App.model.Book', {
    extend : 'Ext.data.Model',
    fields : [
        'id', 'title', 'pages', 'numChapters', 'topic', 'publisher', 'isbn', 'isbn13'
    ]
} );

存储类:

store/Book.js
JavaScript
1
2
3
4
5
6
7
8
Ext.define( 'App.store.Book', {
    extend : 'Ext.data.Store',
    model : 'App.model.Book',
    proxy : {
        type : 'ajax',
        url : 'data/books.json'
    }
} );
添加表格面板
view/book/Grid.js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Ext.define( 'App.view.book.Grid', {
    extend : 'Ext.grid.Panel',
    alias : 'widget.bookList',
    title : 'Books',
    initComponent : function()
    {
        this.store = 'Book';
        this.columns = [
            {
                text : "Title",
                width : 120,
                dataIndex : 'title',
                sortable : true
            }, {
                text : "Pages",
                flex : 1,
                dataIndex : 'pages',
                sortable : true
            }, {
                text : "Topic",
                width : 115,
                dataIndex : 'topic',
                sortable : true
            }, {
                text : "Publisher",
                width : 100,
                dataIndex : 'publisher',
                sortable : true
            }
        ];
        this.viewConfig = {
            forceFit : true
        };
        this.callParent( arguments );
    }
} );
添加详情面板
view/book/DetailPanel.js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Ext.define( 'App.view.book.DetailPanel', {
    extend : 'Ext.Panel',
    alias : 'widget.detailPanel',  //xtype别名
    bookTplMarkup : [  //作为实例变量来定义,而不是全局变量
        '<b>Title:</b> {title}<br/>',
        '<b>Pages:</b> {pages}<br/>',
        '<b>No Chapters:</b> {numChapters}<br/>',
        '<b>Topic:</b> {topic}<br/>',
        '<b>Publisher:</b> {publisher}<br/>',
        '<b>ISBN:</b> {isbn}<br/>',
        '<b>ISBN 13:</b> {isbn13}<br/>'
    ],
    startingMarkup : 'Please select a book to see additional details.',
    bodyPadding : 7,
    initComponent : function()
    {
        this.tpl = Ext.create( 'Ext.Template', this.bookTplMarkup );
        this.html = this.startingMarkup;
        this.bodyStyle = {
            background : '#ffffff'
        };
        this.callParent( arguments );
    },
    updateDetail : function( data )  //供控制器调用,更新此视图组件
    {
        this.tpl.overwrite( this.body, data );
    }
} );

 同时,修改应用骨架、控制器类为最终版本:

app.js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Ext.require( 'Ext.container.Viewport' );
Ext.application( {
    name : 'App',
    appFolder : 'app',
    controllers : [ 'Books'],
    launch : function()
    {
        Ext.create( 'Ext.container.Viewport', {
            layout : 'fit',
            items : [
                {
                    xtype : 'panel',
                    title : 'Books',
                    items : [
                        {
                            xtype : 'booklist'
                        }, {
                            xtype : 'detailPanel'
                        }
                    ]
                }
            ]
        } );
    }
} );

controller/Books.js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Ext.define( 'App.controller.Books', {
    extend : 'Ext.app.Controller',
    stores : [ 'Book' ],  //不需要声明完整的名称,ExtJS会自动在当前App的名字空间、约定目录下寻找
    models : [ 'Book' ],
    views : [ 'book.Grid', 'book.DetailPanel' ],  //控制器可以控制的视图的列表
    refs : [ //该配置用于外部引用控制器内的视图对象,使用Ext.ComponentQuery查询来获取视图
        {
            //变量名,可以直接使用Getter获取
            ref : 'panel',
            //组件选择符
            selector : 'detailPanel'
        }
    ],
    init : function()
    {
        this.getBookStore().load();  //getBookStore是自动生成的方法,等价于this.getStore('Book').load();
        this.control( {
            //控制ViewPort下的bookList(表格)的dataview组件
            'viewport > bookList dataview' : {
                itemclick : this.bindGridToPanel
            }
        } );
    },
    bindGridToPanel : function( grid, record )
    {
        //直接使用Getter获取详情面板,并调用其方法更新视图
        this.getPanel().updateDetail( record.data );
    }
} ); 
控制器的getter方法

声明在stores、views、models配置项中的对象,可以使用控制器类自动生成getter方法访问,这些方法包括两类:

  1. 其中一类是形如getName[Store|View|Model]()的方法,其中Name是配置项中声明的组件的名称。
  2. 另外一些带单个形参的getModel、getStore、getView方法,使用时通过参数传递组件的名称:
 getter方法 说明 
getModel(name) 返回指定模型的引用,目标模型必须在models配置项中声明
getStore(name) 返回指定存储的引用,目标存储必须在stores配置项中声明
getView(name) 返回指定视图的引用,目标视图必须在views配置项中声明
一些MVC开发的TIPS
  1. 创建Model、Store、View类(扩展已有UI组件)
  2. 在View类中不会执行任何操作(事件句柄),View只是提供方法,让控制器调用后改变视图
  3. 在Controller中列出其需要使用的Model、Store、View
  4. 注意Controller自动生成很多getter方法
  5. 为了方便的在Controller中获取View的引用,可以使用ref配置项
  6. 使用control函数声明针对View、Components的事件监听
  7. 注意Controller的init在App的launch之前执行
嵌套Model与MVC

如果为Model声明关联(associations),则必须使用关联目标的全名:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Ext.define( 'App.model.Author', {
    extend : 'Ext.data.Model',
    fields : [
        {
            name : 'id',
            type : 'int'
        }, {
            name : 'name',
            type : 'string'
        }
    ],
    hasMany : {
        model : 'App.model.Book',   //如果仅仅写'Book'会出错
        foreignKey : 'authorId',
        name : 'books'
    },
    proxy : {
        type : 'ajax',
        url : 'data/authors/1.json',
        reader : {
            type : 'json',
            root : 'authors'
        }
    }
} );
为生产环境构建应用

Sencha SDK tools是ExtJS官方提供的开发套件,它可以生成JSB3((JSBuilder file format))格式的JavaScript依赖关系,并且依此生成最小化的运行时JavaScript文件,便于部署。

使用如下的命令可以生成JSB依赖文件:

MS DOS
1
2
3
sencha create jsb -a index.html -p app.js
rem 亦可指向服务器上的HTML文件
sencha create jsb -a http://localhost:8080/ext-theme/index.html -p app.jsb3

上述命令会生成一个app.jsb3文件,其内容如下:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
    "projectName" : "Project Name",
    "licenseText" : "Copyright(c) 2011 Company Name",
    "builds" : [
        {
            "name" : "All Classes",
            "target" : "all-classes.js",
            "options" : {
                "debug" : true
            },
            "files" : [
                {
                    "path" : "extjs/src/util/",
                    "name" : "Observable.js"
                }, {
                    "path" : "extjs/src/data/",
                    "name" : "Association.js"
                }, {
                    "path" : "extjs/src/data/",
                    "name" : "Operation.js"
                }
            ]
        }, {
            "name" : "Application - Production",
            "target" : "app-all.js",
            "compress" : true,
            "files" : [
                {
                    "path" : "",
                    "name" : "app.js"
                }
            ]
        }
    ],
    "resources" : []
}

然后,执行命令:

JavaScript
1
sencha build -p app.jsb3 -d

会生成两个文件:

  1. all-classes.js:包含应用程序用到的所有ExtJS类,未压缩,易于DEBUG
  2. app-all.js:包含应用程序用到的所有ExtJS类、app.js,压缩版本

我们可以修改HTML,引用生成的JavaScript文件:

1
2
3
4
5
6
7
8
9
10
<html>
<head>
    <title>MVC Architecture</title>
    <link rel="stylesheet" type="text/css" href="extjs/resources/css/ext-all.css" />
    <script type="text/javascript" src="extjs/ext.js"></script>
    <script type="text/javascript" src="app-all.js"></script>
</head>
<body>
</body>
</html>

 

 

 

← 定制ExtJS 4主题
いつも何度でも →

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Related Posts

  • SpringMVC知识集锦
  • ExtJS 4的组件机制
  • ExtJS 4的事件系统
  • Sencha Cmd学习笔记
  • ExtJS 4常用组件之表格

Recent Posts

  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
  • A Comprehensive Study of Kotlin for Java Developers
  • 背诵营笔记
  • 利用LangChain和语言模型交互
  • 享学营笔记
ABOUT ME

汪震 | Alex Wong

江苏淮安人,现居北京。目前供职于腾讯云,专注容器方向。

GitHub:gmemcc

Git:git.gmem.cc

Email:gmemjunk@gmem.cc@me.com

ABOUT GMEM

绿色记忆是我的个人网站,域名gmem.cc中G是Green的简写,MEM是Memory的简写,CC则是我的小天使彩彩名字的简写。

我在这里记录自己的工作与生活,同时和大家分享一些编程方面的知识。

GMEM HISTORY
v2.00:微风
v1.03:单车旅行
v1.02:夏日版
v1.01:未完成
v0.10:彩虹天堂
v0.01:阳光海岸
MIRROR INFO
Meta
  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org
Recent Posts
  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
    In this blog post, I will walk ...
  • A Comprehensive Study of Kotlin for Java Developers
    Introduction Purpose of the Study Understanding the Mo ...
  • 背诵营笔记
    Day 1 Find Your Greatness 原文 Greatness. It’s just ...
  • 利用LangChain和语言模型交互
    LangChain是什么 从名字上可以看出来,LangChain可以用来构建自然语言处理能力的链条。它是一个库 ...
  • 享学营笔记
    Unit 1 At home Lesson 1 In the ...
  • K8S集群跨云迁移
    要将K8S集群从一个云服务商迁移到另外一个,需要解决以下问题: 各种K8S资源的迁移 工作负载所挂载的数 ...
  • Terraform快速参考
    简介 Terraform用于实现基础设施即代码(infrastructure as code)—— 通过代码( ...
  • 草缸2021
    经过四个多月的努力,我的小小荷兰景到达极致了状态。

  • 编写Kubernetes风格的APIServer
    背景 前段时间接到一个需求做一个工具,工具将在K8S中运行。需求很适合用控制器模式实现,很自然的就基于kube ...
  • 记录一次KeyDB缓慢的定位过程
    环境说明 运行环境 这个问题出现在一套搭建在虚拟机上的Kubernetes 1.18集群上。集群有三个节点: ...
  • eBPF学习笔记
    简介 BPF,即Berkeley Packet Filter,是一个古老的网络封包过滤机制。它允许从用户空间注 ...
  • IPVS模式下ClusterIP泄露宿主机端口的问题
    问题 在一个启用了IPVS模式kube-proxy的K8S集群中,运行着一个Docker Registry服务 ...
  • 念爷爷
      今天是爷爷的头七,十二月七日、阴历十月廿三中午,老人家与世长辞。   九月初,回家看望刚动完手术的爸爸,发

  • 6 杨梅坑

  • liuhuashan
    深圳人才公园的网红景点 —— 流花山

  • 1 2020年10月拈花湾

  • 内核缺陷触发的NodePort服务63秒延迟问题
    现象 我们有一个新创建的TKE 1.3.0集群,使用基于Galaxy + Flannel(VXLAN模式)的容 ...
  • Galaxy学习笔记
    简介 Galaxy是TKEStack的一个网络组件,支持为TKE集群提供Overlay/Underlay容器网 ...
TOPLINKS
  • Zitahli's blue 91 people like this
  • 梦中的婚礼 64 people like this
  • 汪静好 61 people like this
  • 那年我一岁 36 people like this
  • 为了爱 28 people like this
  • 小绿彩 26 people like this
  • 彩虹姐姐的笑脸 24 people like this
  • 杨梅坑 6 people like this
  • 亚龙湾之旅 1 people like this
  • 汪昌博 people like this
  • 2013年11月香山 10 people like this
  • 2013年7月秦皇岛 6 people like this
  • 2013年6月蓟县盘山 5 people like this
  • 2013年2月梅花山 2 people like this
  • 2013年淮阴自贡迎春灯会 3 people like this
  • 2012年镇江金山游 1 people like this
  • 2012年徽杭古道 9 people like this
  • 2011年清明节后扬州行 1 people like this
  • 2008年十一云龙公园 5 people like this
  • 2008年之秋忆 7 people like this
  • 老照片 13 people like this
  • 火一样的六月 16 people like this
  • 发黄的相片 3 people like this
  • Cesium学习笔记 90 people like this
  • IntelliJ IDEA知识集锦 59 people like this
  • 基于Kurento搭建WebRTC服务器 38 people like this
  • Bazel学习笔记 37 people like this
  • PhoneGap学习笔记 32 people like this
  • NaCl学习笔记 32 people like this
  • 使用Oracle Java Mission Control监控JVM运行状态 29 people like this
  • Ceph学习笔记 27 people like this
  • 基于Calico的CNI 27 people like this
Tag Cloud
ActiveMQ AspectJ CDT Ceph Chrome CNI Command Cordova Coroutine CXF Cygwin DNS Docker eBPF Eclipse ExtJS F7 FAQ Groovy Hibernate HTTP IntelliJ IO编程 IPVS JacksonJSON JMS JSON JVM K8S kernel LB libvirt Linux知识 Linux编程 LOG Maven MinGW Mock Monitoring Multimedia MVC MySQL netfs Netty Nginx NIO Node.js NoSQL Oracle PDT PHP Redis RPC Scheduler ServiceMesh SNMP Spring SSL svn Tomcat TSDB Ubuntu WebGL WebRTC WebService WebSocket wxWidgets XDebug XML XPath XRM ZooKeeper 亚龙湾 单元测试 学习笔记 实时处理 并发编程 彩姐 性能剖析 性能调优 文本处理 新特性 架构模式 系统编程 网络编程 视频监控 设计模式 远程调试 配置文件 齐塔莉
Recent Comments
  • qg on Istio中的透明代理问题
  • heao on 基于本地gRPC的Go插件系统
  • 黄豆豆 on Ginkgo学习笔记
  • cloud on OpenStack学习笔记
  • 5dragoncon on Cilium学习笔记
  • Archeb on 重温iptables
  • C/C++编程:WebSocketpp(Linux + Clion + boostAsio) – 源码巴士 on 基于C/C++的WebSocket库
  • jerbin on eBPF学习笔记
  • point on Istio中的透明代理问题
  • G on Istio中的透明代理问题
  • 绿色记忆:Go语言单元测试和仿冒 on Ginkgo学习笔记
  • point on Istio中的透明代理问题
  • 【Maven】maven插件开发实战 – IT汇 on Maven插件开发
  • chenlx on eBPF学习笔记
  • Alex on eBPF学习笔记
  • CFC4N on eBPF学习笔记
  • 李运田 on 念爷爷
  • yongman on 记录一次KeyDB缓慢的定位过程
  • Alex on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • haolipeng on 基于本地gRPC的Go插件系统
  • 吴杰 on 基于C/C++的WebSocket库
©2005-2025 Gmem.cc | Powered by WordPress | 京ICP备18007345号-2