打杂到肯定时候,也要总结总结,4年前UI工作做得蛮多,目前开发工作接触的蛮多,其实就是为了我的项目的落地不求人,人不知;鬼不觉学了些货色,空闲之余做了一些货色。
明天有有数的React UI工具包和库。那面对这么多抉择,面对新的我的项目挑战,我下一步应该做什么?是学习新框架,还是本人造轮子,还是去开掘一些工具,总之,我须要一个思考,以便更好高空对将来更多的技术需要和变革。框架毕竟只是框架,抛开场景谈用处都不对,我应该思考如何从个人成长和我的项目需要,语言基本功的训练等方面来布局将来,布局这个开源工具的工作。这就是为什么在一年中这个忙碌的工夫里,我依然抽时间学习一些前端或后端的技术,它们如此重要。不过,首先我会思考某些框架是否适宜去采纳。另外我特地关注2021年至2022年新冠病毒的大风行对工作对行业倒退的各种影响。
上面是这个小玩意儿的预览:
Github资源:https://github.com/xizon/poemkit
PoemKit能够间接通过命令工作和部署到云服务器, 但依然须要在其背地编写真正的代码,这些工具包作为UI组件和逻辑模块,能够组合成一个真正的应用程序原型。它依然须要编程性能能力使它们在理论需要中工作。
这个我的项目的一个乏味的方面,其实是对webpack很强的自定义个性,如果你想疾速用于产出,也能够间接导入蚂蚁组件等第三方组件库,为了进一步欠缺模型,PoemKit提供了50多个内置UI组件,用于构建古代Web应用程序。
先说说我的想法吧。
为了适应一些大型的网站平台和软件我的项目,我思考了一些React框架,比方Nextjs,然而最终我决定临时放弃它(只是暂时性的,对于将来的某些我的项目也可能间接采纳),我想让网站的架构可能自在的操控,比方webpack脚手架的功能性,扩展性。一方面从零开始搭建webpack脚手架,也可能让我深刻学习各方面的常识,让我零碎的理解React网站的架构原理和实现办法,同时将它积淀为开源的工具箱,可能在将来给我的我的项目提供必要的反对和参考。
如果进行数据传输,那么我将优先应用Redux来做跨组件状态管理器,将来依据我的项目须要也会应用一些便携的工具包。我将所有的UI组件都应用TypeScript来编写,一方面组件库系统化利于治理,一方面它们和整个React网站的逻辑区块不会抵触。它还要可能间接导入其它UI组件库,比方Ant Design. 于此同时,该工具箱须要内置自定义React组件,以不便集成并改善开发人员体验。
对于制作一个前后端齐全拆散的网站,我还须要思考响应式和一些酷炫的交互成果,简单的动画我应用了GSAP插件,并且让整个网站兼容Bootstrap和常见的图标库,以提供更加敌对的款式反对。它和自身内置的款式和脚本不抵触,这是我对于我的项目交互复杂化的思考。
最初须要思考SEO的问题,我也会进一步解决。比方让整个React网站反对自定义的meta标签和title等,至于性能,组件之间的通信和挂载、卸载,都严格参考相干的官网文档,做了脚本优化的解决。
当然,对于一个学习人,我的代码和脚本并不是十分高端和优良,然而整个开源产品让我的思维和整体技术失去了十分多的学习和晋升,也让我对将来的新我的项目多了很多抉择。我心愿它能给大家带来一些用处,也非常感谢大家急躁浏览我的文字。
接着,我还须要为他取一个不错的名字,因为我喜爱WordPress,WordPress有一句谚语:Code is Poetry. 说的就是代码如同诗歌个别美好。做这个工具包,我也是为了做出更加如诗美好的网站而致力,所以PoemKit就算这么来的。
演示
在线演示 https://uiux.cc/poemkit
服务器端运行 http://localhost:3000
介绍
- 根底环境: TypeScript 4.x.x + Babel 7.x.x + Webpack 5.x.x
- 提供结构化布局对象、UI控件等多种预置UI组件
- 可拜访的URL、SEO优化,以及应用React Helmet使您的站点对搜索引擎敌对
- 集开发、调试、打包和部署为一体
- 它不是一个JavaScript框架
- 没有jQuery且不绑定任何工具库
- 反对服务器端渲染(SSR)
- 组件拆散,能够导入任何第三方UI组件到我的项目 (比方Ant Design)
- 应用Sass/SCSS来设置React组件的款式
- 主动捆绑并生成独立的外围CSS和JS文件
- 反对通过pm2主动部署到服务器
- ✂️ 插件扩大: 默认组件演示导入了诸如Bootstrap4栅格零碎, GSAP动画库, FontAwesome图标库, 3D引擎等罕用的第三方插件,以便可能疾速扩大您的网站 (能够按需配置须要导入的库或者插件)
- ✂️ 可配置脚手架: 独立打包dist文件(您能够自主批改
webpack.config.js
应用内存挂载)
开发者基本操作:
- 配置你电脑的Node.js环境,举荐
Node 14+
版本,测试环境为v14.16.0 - 下载完资源后,进入到
poemkit
目录下,运行相干命令进行开发或者部署。 - 当你须要配置脚手架和网站根底信息和构造的时候,可编辑
package.json
文件。 - 我的项目文件会打包生成到
./dist/*
和./public/*.html
.
命令应用办法:
Step 1. 下载我的项目
$ sudo npm install poemkit
或者克隆我的项目:
$ git clone git://github.com/xizon/poemkit.git
Step 2. 应用命令进入 poemkit/
目录, {your_directory}换成你的目录门路
$ cd /{your_directory}/poemkit
Step 3. 装置所须要的依赖项
$ sudo npm install
Step 4. 罕用的命令:
调试应用程序, 它能够用来独自查看TypeScript类型的文件而不进行编译操作,便于进步开发效率,专一整体代码的编写。
$ npm run check
打包生成CSS,JS,HTML文件
$ npm run build
运行上面的命令进行本地测试和代码查看 (仅运行Express服务器)。 应用 Ctrl + C
退出终端
$ npm run dev
Step 5. 浏览器中拜访以下网址,可疾速调试:
http://localhost:3000
倡议在调试之前将新代码从新编译打包。
Step 6 (可选). 用PM2启动Reactjs应用程序(仅在应用Node v13.9.0或更高版本时无效)。
6.1) 装置Node和NPM
$ curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -$ sudo yum install nodejs$ node --version #v14.16.1$ npm --version #6.14.12$ which node babel-node #check the location of node and babel-node
6.2) 全局装置PM2
$ sudo npm install pm2@latest -g
6.3) 全局装置Babel
$ sudo npm install -g babel-cli$ sudo npm install -g @babel/core @babel/cli @babel/preset-env
6.4) 全局装置TypeScript和ts-node
$ sudo npm install -g typescript ts-node
6.5) 应用PM2装置TypeScript依赖
$ sudo pm2 install typescript
6.6) PM2常用命令:
#先进入 `"poemkit/"` 目录 $ cd /{your_directory}/poemkit#用pm2运行利用$ pm2 start ecosystem.config.js#其它命令$ pm2 restart ecosystem.config.js$ pm2 stop ecosystem.config.js$ pm2 delete ecosystem.config.js$ pm2 list$ pm2 logs
6.7) 应用域名拜访您的React利用。
须要在Apache或Nginx的Web服务器上部署React App。请参考网络以获取无关设置代理的教程。
Step 7 (可选). 单元测试
$ npm run test
Step 8 (可选). 部署到服务器
$ npm run deploy
撤销现有部署:
$ npm run destroy
⚙️ 舒适提醒:
a) ERROR: npm update check failed.
如果呈现如上谬误,示意nodejs的环境或权限问题,能够应用上面的命令解决,留神把{username}换成你本人的设施里的名字。
$ sudo chown -R $USER:$(id -gn $USER) /Users/{username}/.config
b) ERROR: Node sass version 6.x.x is not compatible with ^ 4.x.x.
如果呈现如上谬误,请批改node-sass的版本:
$ npm install node-sass@4.14.1
c) 如果降级Node版本,请执行以下代码:
$ sudo npm install$ sudo npm rebuild node-sass
⚙️ 配置模块和别名:
您能够通过批改 webpack.config.js
的 resolve
属性来创立 import
或 require
的别名,来确保模块引入变得更简略.
webpack.config.js
:
...const alias = { pathConfig : './src/config', pathComponents : './src/client/components', pathRouter : './src/client/router', pathHelpers : './src/client/helpers', pathServices : './src/client/services', pathReducers : './src/client/reducers', pathPages : './src/client/views/_pages', pathActions : './src/client/actions', pathServer : './src/server', pathStore : './src/store'};...resolve: { extensions: ['.js', '.es6', '.vue', '.jsx', '.ts', '.tsx' ], alias: { // 须要同时配置 `babel.config.js` 和 `tsconfig.json` 文件 '@poemkit/config': path.resolve(__dirname, alias.pathConfig ), '@poemkit/components': path.resolve(__dirname, alias.pathComponents ), '@poemkit/router': path.resolve(__dirname, alias.pathRouter ), '@poemkit/helpers': path.resolve(__dirname, alias.pathHelpers ), '@poemkit/services': path.resolve(__dirname, alias.pathServices ), '@poemkit/reducers': path.resolve(__dirname, alias.pathReducers ), '@poemkit/pages': path.resolve(__dirname, alias.pathPages ), '@poemkit/actions': path.resolve(__dirname, alias.pathActions ), '@poemkit/server': path.resolve(__dirname, alias.pathServer ), '@poemkit/store': path.resolve(__dirname, alias.pathStore ), }},...
babel.config.js
:
... "plugins": [ ["module-resolver", { "root": ["./src"], "alias": { "@poemkit/config": "./src/config", "@poemkit/components": "./src/client/components", "@poemkit/router": "./src/client/router", "@poemkit/helpers": "./src/client/helpers", "@poemkit/services": "./src/client/services", "@poemkit/reducers": "./src/client/reducers", "@poemkit/pages": "./src/client/views/_pages", "@poemkit/actions": "./src/client/actions", "@poemkit/server": "./src/server", "@poemkit/store": "./src/store" } }] ]...
tsconfig.json
:
{ "compilerOptions": { "baseUrl": "./src", "paths": { "@poemkit/config/*": ["config/*"], "@poemkit/components/*": ["client/components/*"], "@poemkit/router/*": ["client/router/*"], "@poemkit/helpers/*": ["client/helpers/*"], "@poemkit/services/*": ["client/services/*"], "@poemkit/reducers/*": ["client/reducers/*"], "@poemkit/pages/*": ["client/views/_pages/*"], "@poemkit/actions/*": ["client/actions/*"], "@poemkit/server/*": ["server/*"], "@poemkit/store/*": ["store/*"] } }}
package.json
:
{ "jest": { "testEnvironment": "jsdom", "moduleNameMapper": { "\\.(css|less|scss|sass)$": "identity-obj-proxy", "^@poemkit/config/(.*)": "<rootDir>/src/config/$1", "^@poemkit/components/(.*)": "<rootDir>/src/client/components/$1", "^@poemkit/router/(.*)": "<rootDir>/src/client/router/$1", "^@poemkit/helpers/(.*)": "<rootDir>/src/client/helpers/$1", "^@poemkit/services/(.*)": "<rootDir>/src/client/services/$1", "^@poemkit/reducers/(.*)": "<rootDir>/src/client/reducers/$1", "^@poemkit/pages/(.*)": "<rootDir>/src/client/views/_pages/$1", "^@poemkit/actions/(.*)": "<rootDir>/src/client/actions/$1", "^@poemkit/server/(.*)": "<rootDir>/src/server/$1", "^@poemkit/store/(.*)": "<rootDir>/src/store/$1" }, "transform": { "^.+\\.(js|jsx)$": "babel-jest", "^.+\\.(ts|tsx)?$": "ts-jest" } }}
⚙️ 库相干配置:
您能够通过批改 webpack.config.js
的 output
属性来批示 webpack 如何去输入、以及在哪里输入你的「bundle、asset 和其余你所打包或应用 webpack 载入的任何内容」
...const globs = { port : 8080, examples : 'public', build : 'src/client', dist : 'dist'};...output: { path: path.resolve(__dirname, './' + globs.dist + '/js' ), filename: '[name].js'},...
⚙️ 网站配置:
批改package.json
文件即可:
{ "author": "UIUX Lab", "name": "poemkit", "email": "uiuxlab@gmail.com", "version": "1.0.0", "projectName": "PoemKit", "createdInfo": "UIUX Lab (https://uiux.cc)", "projectURL": "https://uiux.cc", "description": "React Toolkit for Building a Full Website", ...}
⚙️ 路由配置:
路由配置同时也兼顾了网站的主导航(不包含将在主导航的页面上配置的嵌套路由)。 拜访文件 ./src/client/router/RoutesConfig.js
.
路由器的一些脚本能够在文件中批改 ./src/client/router/App.js
.
⚙️ 服务端渲染配置:
服务端渲染和标签替换的一些脚本能够在文件中批改 ./src/server/renderer.js
.
⚙️ 设置服务器代理:
为了同时运行服务器和React应用程序,咱们须要在 package.json
中增加proxy
键。咱们曾经将服务器设置为在端口3000上运行,因而将代理指向 localhost:3000
。
{ "proxy": "http://localhost:3000", ...}
⚙️ 应用 PropTypes
查看类型:
$ npm run dev
应用上面的JavaScript脚本能够编写调试代码,在终端显示谬误和正告信息。
import PropTypes from "prop-types";import React, { Component } from 'react';export default class YourComponentName extends Component { public static propTypes = {}; constructor(props) { super(props); } render() { ... }}if ( process.env.NODE_ENV === 'development' ) { YourComponentName.propTypes = { displayEnable: PropTypes.bool.isRequired, htmlString: PropTypes.oneOfType([PropTypes.string, PropTypes.object]) } }
⚙️ 自定义导入的第三方库或插件:
利用默认加载了罕用的第三方库(图标,动画,3D引擎等),您能够按需加载,或者批改导入配置。第三方插件配置文件位于 ./src/client/components/_plugins/
. 第三方插件默认和自定义组件一起应用,您也能够被动移除它们。
⚙️ 网站根目录配置:
更改网站的根目录,以便您的我的项目上传到另一个目录时能够应用它。批改 ./src/config/websiteConfig.js
的键 rootDirectory
。
如果该文件位于根目录中,则能够将其保留为空。 如果在另一个目录中,则能够写成 "/blog" (结尾不要加斜杠)
{ "rootDirectory": ""}
⚙️ 网站URL配置:
网站地址(URL)通常被用于SEO优化。批改 ./src/config/websiteConfig.js
的键 siteUrl
。一个残缺的URL个别被命名为 https://domain-name.com
(结尾不要加斜杠和子目录名称)
{ "siteUrl": ""}
⚙️ 接口API配置:
批改 ./src/config/websiteConfig.js
的键 API
, 如下代码:
{ "API": { "RECEIVE_DEMO_LIST": "https://apiurl1.com", "RECEIVE_DEMO_LISTDETAIL": "https://apiurl2.com" }}
目录构造
poemkit/├── README.md├── CHANGELOG.md├── CONTRIBUTING.md├── LICENSE├── ecosystem.config.js ------------------------- # 用于pm2部署├── babel.config.js├── webpack.config.js ├── package-lock.json├── package.json ├── test/ --------------------------- # 单元测试脚本├── public/ --------------------------- # 主动生成的首页HTML动态模板│ ├── index.html │ ├── manifest.json│ └── server/ ------------------------------- # 用于服务器测试的PHP脚本│ └── assets/├── dist/ ------------------------------- # web 编译出的文件,用于生产环境│ ├── css/│ │ ├── poemkit.css│ │ └── poemkit.min.css│ └── js/│ │ ├── poemkit.js│ │ └── poemkit.min.js├── src/│ ├── client/│ │ ├── client.js│ │ ├── actions/│ │ ├── reducers/│ │ ├── helpers/│ │ ├── services/│ │ ├── router/│ │ ├── components/ ------------------------- # 独立的UI组件│ │ │ ├── */│ │ │ ├── _utils/ ----------------------- # 罕用的实用程序和款式脚本│ │ │ └── _plugins/ --------------------- # 第三方插件│ │ ├── views/ ------------------------------ # 网站页面│ │ │ ├── _pages/│ │ │ └── _html/│ └── server/│ │ ├── app.js│ │ ├── server.js│ │ └── renderer.js│ └── store/│ │ └── createStore.js│ └── config/│ │ ├── tmpl-manifest.json ------------------ # 主动生成的 `manifest.json` 文件模板│ │ └── websiteConfig.js -------------------- # 网站配置文件(比方根目录)└──
兼容性
Chrome | Firefox | Edge | IE | Safari | Opera | iOS | Android |
---|---|---|---|---|---|---|---|
>= 49 | >= 45 | >=14 | >=11 | >= 9 | >= 30 | >=10 | >=4.4 |
反对的开发环境
- 反对React 17 +
- 反对ReactTypeScript 4.x.x +
- 反对ReactBabel 7.x.x +
- 反对ReactWebpack 5.x.x
这些是我的想法。如果您想探讨某些内容或对如何改良有更多意见,请随时通知我!感激!