# page-builder **Repository Path**: devenc/page-builder ## Basic Information - **Project Name**: page-builder - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-06-19 - **Last Updated**: 2024-06-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # page-builder 这是一个页面构建平台demo,通过在平台上进行相关组件的选择,即可构建出想要的页面。 [demo点这里(预览功能可能需要翻墙。服务器是最垃圾的,撑不太住较多人……)](https://cqmfe.club/page-builder/home) ## 运行项目 ``` npm install //安装依赖 npm run package //对组件打包,使预览功能能正常使用 npm start //启动服务 ``` ## 项目展示图 该项目UI部分模仿了阿里云凤蝶     ## 注意事项 该项目以展示思路为主,只有打包和预览部分运用了node,并未使用数据库,项目列表等其它部分的数据均保存在``localStorage``与``sessionStorage``中。 ## 项目目录 src/client 下基本为页面生成平台的客户端部分,内部包含了页面平台web端操作的流程代码。 src/component-list 下为你所编写可添加到页面上的组件,也包括了一些开发组件的公共函数。 以article组件为例,在src/component-list/article下可以看到三个文件夹和两个文件。 src/component-list/article/client目录下编写的文件是显示在操作平台上的组件,并不是实际打包生成的组件。 src/component-list/article/tool目录下编写的文件是用于编辑自定义组件中数据的一个操作面板。 src/component-list/article/server目录下编写的文件是实际打包生成到页面上的组件代码。 src/component-list/article/defaultValue是组件中默认填充的数值 src/component-list/article/index是一个单纯的入口文件 其它组件的目录结构也同理。 --- src/server 中存放的是项目服务端的代码 src/server/app 中存放的是服务端的一些接口代码 src/server/createFile.js 根据客户端上传的页面状态json,动态生成React.js文件的逻辑代码 src/server/createPreview.js 用来创建预览的.html文件的逻辑代码 src/server/package-webpack-plugin.js 一个webpack自定义插件,用来监控打包状况,并通过websocket告知客户端进度 src/server/webpack-dynamic.js 一个webpack配置文件,对createFile.js文件生成的js代码进行打包 src/server下动态生成的目录 src/server/build-page/ 存放最终打包完成生成的文件和压缩包 src/server/page-file/ 存放createFile.js文件生成的React.js代码 src/server/preview-page/ 存放createPreview文件生成的可供预览的``.html``文件 ## 实现思路 ### 页面数据结构和打包原理介绍 当前项目中所包含的页面以及页面中的组件和组件中的状态,均以json格式存在redux store当中。数据结构大致如下: ``` [ { id: "519a2c84-d7db-4127-aac9-a0e5a101e9a7", path: "index", title: "首页", componentList: [ { id: "7eeedba8-5e7c-4b14-b42f-81ff2c6be414", type: "banner", props: { bannerList: [ ...滚动项的属性 ], height: 200 } }, { id: "a86cec25-6db8-44e0-b60e-fbde838227b2", type: "text", props: { content: "这是一段文本" } } ] }, { id: "662776d3-14d5-46e7-b258-9a6bd0d2e1df", path: "child", title: "子页面", componentList: [ { id: "", type: "paragraph", props: { content: "
这是一段p标签中的文本
", title: "段落标题" } } ] } ] ``` 数组中的每一个对象都代表了一个页面,页面项中的componentList属性则是该页面中所存在的数组。 对页面的新增和修改操作,均是对以上数据结构进行编辑和操作。 当点击提交时,会将这个json发送至服务端,服务端会使用Node的writeFile API来生成React.js文件(如页面有多个,则生成对个js文件)。生成的文件示例如下: ``` //引入React相关依赖包 import React from 'react' import ReactDOM from 'react-dom' //引入开发好的页面组件 import {BannerServer as Banner} from '@/component-list/banner' import {ParagraphServer as Paragraph} from '@/component-list/paragraph' //..... const list = [...接收到的json数据] document.title = 'xxx' //根据type选择渲染不同的组件 const componentMap = { 'banner': (item) =>