diff --git "a/data/3.Vue\351\253\230\351\230\266/1.Vue\346\234\215\345\212\241\347\253\257\346\270\262\346\237\223/1.SSR/config.json" "b/data/3.Vue\351\253\230\351\230\266/1.Vue\346\234\215\345\212\241\347\253\257\346\270\262\346\237\223/1.SSR/config.json" index 1736ef1d6a76ae4aa1528f808c5400192982fefe..011f07fd784812b61a5c51d4cc7701282c8d8e42 100644 --- "a/data/3.Vue\351\253\230\351\230\266/1.Vue\346\234\215\345\212\241\347\253\257\346\270\262\346\237\223/1.SSR/config.json" +++ "b/data/3.Vue\351\253\230\351\230\266/1.Vue\346\234\215\345\212\241\347\253\257\346\270\262\346\237\223/1.SSR/config.json" @@ -1,8 +1,15 @@ { "node_id": "vue-d26464a7a4df460d91c815052c942097", - "keywords": [], + "keywords": [ + "服务端渲染", + "SSR" + ], "children": [], - "export": [], - "keywords_must": [], + "export": [ + "exercises.json" + ], + "keywords_must": [ + "SSR" + ], "keywords_forbid": [] } \ No newline at end of file diff --git "a/data/3.Vue\351\253\230\351\230\266/1.Vue\346\234\215\345\212\241\347\253\257\346\270\262\346\237\223/1.SSR/exercises.json" "b/data/3.Vue\351\253\230\351\230\266/1.Vue\346\234\215\345\212\241\347\253\257\346\270\262\346\237\223/1.SSR/exercises.json" new file mode 100644 index 0000000000000000000000000000000000000000..a55a353b5237b90d852ed77c3c3aebb3993f7f4e --- /dev/null +++ "b/data/3.Vue\351\253\230\351\230\266/1.Vue\346\234\215\345\212\241\347\253\257\346\270\262\346\237\223/1.SSR/exercises.json" @@ -0,0 +1,7 @@ +{ + "type": "code_options", + "author": null, + "source": "exercises.md", + "notebook_enable": false, + "exercise_id": "1524d1a17fef4b82a529fa92e6bb2306" +} \ No newline at end of file diff --git "a/data/3.Vue\351\253\230\351\230\266/1.Vue\346\234\215\345\212\241\347\253\257\346\270\262\346\237\223/1.SSR/exercises.md" "b/data/3.Vue\351\253\230\351\230\266/1.Vue\346\234\215\345\212\241\347\253\257\346\270\262\346\237\223/1.SSR/exercises.md" new file mode 100644 index 0000000000000000000000000000000000000000..f2d40ef5933625d1eeb6cd0b64e346ad24a6b17a --- /dev/null +++ "b/data/3.Vue\351\253\230\351\230\266/1.Vue\346\234\215\345\212\241\347\253\257\346\270\262\346\237\223/1.SSR/exercises.md" @@ -0,0 +1,121 @@ +# SSR + +
小常识:
+
+ +什么是SSR? + +
+ +
+Vue.js 是一个用于构建客户端应用程序的框架。默认情况下,Vue 组件在浏览器中生成和操作 DOM 作为输出。但是,也可以在服务器上将相同的组件渲染为 HTML 字符串,直接将它们发送到浏览器,最后将静态标记“水合”成客户端上的完全交互式应用程序。 + +服务器渲染的 Vue.js 应用程序也可以被认为是“同构的”或“通用的”,因为您的应用程序的大部分代码都在服务器和客户端上运行。 +

+ +目前我们的vue组件都是在浏览器侧通过js渲染出来的,所以首次加载时间很慢,那么我们把vue组件交给服务端负责渲染,渲染为完整内容之后直接返给客户端,是不是就可以可以解决既想渲染快,还想继续使用vue进行开发的问题了? +

+ + +为什么选择 SSR? +

+与客户端单页应用程序(SPA)相比,SSR 的优势主要在于: +

+更快的内容生成时间:这在慢速互联网或慢速设备上更为突出。服务器渲染的标记不需要等到所有 JavaScript 下载并执行后才显示,因此您的用户将更快地看到完全渲染的页面。此外,初次访问的数据获取是在服务器端完成的,它与您的数据库的连接可能比客户端更快。这通常会导致改进的Core Web Vitals指标、更好的用户体验,并且对于内容时间与转化率直接相关的应用程序至关重要。 +

+统一的思维模型:您可以使用相同的语言和相同的声明式、面向组件的思维模型来开发整个应用程序,而不是在后端模板系统和前端框架之间来回切换。 +

+更好的 SEO:搜索引擎爬虫将直接看到完全呈现的页面。 + +

+ +[vue ssr基础使用](https://ssr.vuejs.org/zh/guide/#%E5%AE%89%E8%A3%85) +
+新建vue-ssr文件夹 +
+``` +vue-ssr +``` +
把server文件夹中的文件拷贝进来

+ +

安装必要依赖 +
+```bash +npm install vue vue-server-renderer --save +``` +
+

vue服务端渲染最小demo +
+`app.js` +
+ +```js +const Vue = require('vue') +const server = require('express')() + +const renderer = require('vue-server-renderer').createRenderer() + +server.get('*', (req, res) => { + const app = new Vue({ + data: { + url: req.url + }, + template: `
访问的 URL 是:{{ url }}
`, + }) + renderer.renderToString(app, (err, html) => { + if (err) throw err + res.send(html) + }) +}) + +server.listen(8888,() => console.log(`Example app listening on port 8888!`)) +``` +

+
+浏览器访问 +
+`http://localhost:8888` +
+
+![在这里插入图片描述](https://img-blog.csdnimg.cn/6df5acdf1be443e38ac1ef7a24e92ddd.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Yeg5L2V5b-D5YeJ,size_20,color_FFFFFF,t_70,g_se,x_16) + +
+

查看源代码 +
+ +![在这里插入图片描述](https://img-blog.csdnimg.cn/59c8621bee034e2980cddc71ccee5cfc.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Yeg5L2V5b-D5YeJ,size_20,color_FFFFFF,t_70,g_se,x_16) + +
+ + +
+结论:我们通过在服务器端渲染vue组件的方式,让网页中又有了完整的内容,这样我们就可以既使用了vue开发又节省了首次渲染时间 + + + +
+ + + + +
小测试:
+ +下面对于服务端渲染和客户端渲染描述不正确的是?

+ +## 答案 + +服务端渲染的用户体验一定优于客户端渲染 + +## 选项 + +### A + +通过vue-cli,create-react-app 等工具创建的项目是服务端渲染的 + +### B + +服务端渲染对SEO更加友好,而且首屏渲染通常更快一些 + +### C + +SPA是客户端渲染的 \ No newline at end of file diff --git "a/data/3.Vue\351\253\230\351\230\266/1.Vue\346\234\215\345\212\241\347\253\257\346\270\262\346\237\223/2.Nuxt.js/config.json" "b/data/3.Vue\351\253\230\351\230\266/1.Vue\346\234\215\345\212\241\347\253\257\346\270\262\346\237\223/2.Nuxt.js/config.json" index ec60f6ba37c863d13d91c40512549e968628acd3..536abd52d07cfc70ffb0cd041a684d0ab1561f2b 100644 --- "a/data/3.Vue\351\253\230\351\230\266/1.Vue\346\234\215\345\212\241\347\253\257\346\270\262\346\237\223/2.Nuxt.js/config.json" +++ "b/data/3.Vue\351\253\230\351\230\266/1.Vue\346\234\215\345\212\241\347\253\257\346\270\262\346\237\223/2.Nuxt.js/config.json" @@ -2,7 +2,9 @@ "node_id": "vue-9955251e862745919db545791d1b8d44", "keywords": [], "children": [], - "export": [], + "export": [ + "exercises.json" + ], "keywords_must": [], "keywords_forbid": [] } \ No newline at end of file diff --git a/data/tree.json b/data/tree.json index 7a3959a4123d4ec767322ff2a2dba0fcc5f23691..8f3a022c5c886c609bdc5feb2466af4bb16c099e 100644 --- a/data/tree.json +++ b/data/tree.json @@ -28,8 +28,7 @@ "简介" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -48,8 +47,7 @@ "响应式" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -67,8 +65,7 @@ "优点" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -86,14 +83,12 @@ "query" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -119,8 +114,7 @@ "配置" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -136,8 +130,7 @@ "命令" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -153,14 +146,12 @@ "安装" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -181,8 +172,7 @@ "安装" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -203,8 +193,7 @@ "初始化" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -221,8 +210,7 @@ "生命周期" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -238,8 +226,7 @@ "指令" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -256,8 +243,7 @@ "计算属性" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -274,14 +260,12 @@ "侦听器" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -302,8 +286,7 @@ "插值表达式" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -320,8 +303,7 @@ "过滤器" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -340,8 +322,7 @@ "绑定" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -360,14 +341,12 @@ "修饰符" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -387,8 +366,7 @@ "keywords_must": [ "V-model" ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -405,20 +383,17 @@ "修饰符" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -446,8 +421,7 @@ "组件" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -466,8 +440,7 @@ ], "keywords_forbid": [ "非父子" - ], - "group": 0 + ] } }, { @@ -485,8 +458,7 @@ "通信" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -507,8 +479,7 @@ "插槽" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -529,14 +500,12 @@ "异步组件" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -558,8 +527,7 @@ "介绍" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -578,8 +546,7 @@ "安装" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -596,8 +563,7 @@ "导航" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -613,8 +579,7 @@ "动态路由" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -631,8 +596,7 @@ "传参" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -656,8 +620,7 @@ "别名" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -673,8 +636,7 @@ "路由模式" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -693,8 +655,7 @@ ], "keywords_forbid": [ "后置" - ], - "group": 0 + ] } }, { @@ -711,14 +672,12 @@ ], "keywords_forbid": [ "前置" - ], - "group": 0 + ] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -740,8 +699,7 @@ "介绍" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -762,8 +720,7 @@ "配置" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -780,8 +737,7 @@ "核心" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -798,18 +754,16 @@ "api" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { - "Vue-cli": { + "vue-cli": { "node_id": "vue-b5059c2749d74633ad30145ec28cc22e", "keywords": [], "children": [ @@ -827,8 +781,7 @@ "安装" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -846,8 +799,7 @@ "项目" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -863,8 +815,7 @@ "命令" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -881,8 +832,7 @@ "配置" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -896,14 +846,12 @@ "keywords_must": [ "ESLint" ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -932,8 +880,7 @@ "使用" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -953,8 +900,7 @@ "配置" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -980,8 +926,7 @@ "请求" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1001,14 +946,12 @@ "跨域" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1031,8 +974,7 @@ "模块化" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1049,8 +991,7 @@ "介绍" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1066,8 +1007,7 @@ "安装" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1084,8 +1024,7 @@ "使用" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1102,14 +1041,12 @@ "配置" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1131,8 +1068,7 @@ "介绍" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1148,8 +1084,7 @@ "语法" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1166,8 +1101,7 @@ "占位符" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1185,14 +1119,12 @@ "安装" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1216,8 +1148,7 @@ "自定义指令" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1237,8 +1168,7 @@ "钩子函数" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1255,14 +1185,12 @@ "参数" ] ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1271,14 +1199,12 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1297,8 +1223,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1307,14 +1232,12 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1328,8 +1251,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1338,14 +1260,12 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1359,8 +1279,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1369,8 +1288,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1379,8 +1297,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1389,14 +1306,12 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1410,8 +1325,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1420,8 +1334,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1430,8 +1343,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1440,14 +1352,12 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1461,8 +1371,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1471,8 +1380,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1481,8 +1389,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1491,14 +1398,12 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1512,8 +1417,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1522,8 +1426,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1532,14 +1435,12 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1553,8 +1454,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1563,8 +1463,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1573,8 +1472,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1583,8 +1481,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1593,14 +1490,12 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1614,8 +1509,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1626,8 +1520,7 @@ "keywords_must": [ "Object.defineProperty" ], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1636,8 +1529,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1646,8 +1538,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1656,8 +1547,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1666,8 +1556,7 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } }, { @@ -1676,25 +1565,21 @@ "keywords": [], "children": [], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } ], "keywords_must": [], - "keywords_forbid": [], - "group": 0 + "keywords_forbid": [] } } \ No newline at end of file