公司突然组织需要重新搭建一个基于node的论坛系统,前端采用react,上网找了一些脚手架,或多或少不能满足自己的需求,最终在基于YeoManreact脚手架generator-react-webpack上搭建改造,这里作为记录。

代码在这里:github

另外推荐地址:react-starter-kit

简单文件夹结构

  1. ├── README.md # 项目README文件
  2. ├── conf # 配置文件夹
  3.    └── webpack # webpack配置(下面包括开发、生产、测试环境的配置)
  4. ├── karma.conf.js # karma测试配置文件
  5. ├── node_modules # 包文件夹
  6. ├── package.json # 包描述文件
  7. ├── src # 源文件夹
  8.    ├── actions # redux actions文件夹
  9.    ├── client.js # 客户端启动文件
  10.    ├── components # 项目组件(下面分为业务组件和公共组件)
  11.    ├── config # 环境配置文件夹(指明当前环境)
  12.    ├── containers # 入口容器
  13.    ├── exports.js # 常用组件的exports文件,可以忽略
  14.    ├── images # 图片
  15.    ├── index-release.html # 生产环境模板文件
  16.    ├── index.html # 开发环境入口html
  17.    ├── reducers # redux reducers文件夹
  18.    ├── routes # 路由配置
  19.    ├── sources # 资源文件(可忽略)
  20.    ├── static # 静态文件(可以存放第三方库)
  21.    ├── stores # redux stores文件夹
  22.    ├── styles # 全局样式文件夹
  23.    └── views # 视图文件夹
  24. ├── test # 测试文件夹
  25.    ├── actions # 测试actions
  26.    ├── components # 测试组件
  27.    ├── config # 测试配置(检测环境)
  28.    ├── loadtests.js # 加载测试文件
  29.    ├── reducers # 测试reducers
  30.    ├── sources # 测试资源(flux datasource)
  31.    └── stores # 测试stores
  32. └── webpack.config.js # webpack配置入口文件

整体应用技术

  • react
  • redux
  • react-router(4.0.0^,可以换成2x或者3x)
  • eslint
  • karma + mocha
  • immutable(可选)

在原始脚手架上新增

  • 路由(react-router)
  • 调试工具(react devTools)
  • 增加文件分类(images/fonts/media)
  • 生产配置增加文件hash,公共库拆分
  • 添加异步middleware,统一处理全局状态
  • 改造Actions/Reducers

改造过程

拆分生产环境公共库,生成文件hash

  1. this.config = {
  2. cache: false,
  3. devtool: 'source-map',
  4. entry: {
  5. main: ['./client.js'],
  6. vendor: ['react', 'react-dom', 'redux', 'react-redux', 'react-router-dom',
  7. 'react-router-redux', 'react-css-modules', 'history']
  8. },
  9. plugins: [
  10. new webpack.DefinePlugin({
  11. 'process.env.NODE_ENV': '"production"'
  12. }),
  13. new webpack.optimize.AggressiveMergingPlugin(),
  14. new webpack.NoEmitOnErrorsPlugin(),
  15. new webpack.optimize.CommonsChunkPlugin({
  16. name: 'vendor',
  17. minChunks: Infinity
  18. }),
  19. new HtmlWebpackPlugin({
  20. filename: path.resolve('./dist/index.html'),
  21. template: path.resolve('./src/index-release.html'),
  22. inject: 'body'
  23. })
  24. ]
  25. };
  26. this.config.output.filename = '[name].[chunkhash].js';

主要在entry上做了文章,将公共库分离成vendor,同时配合CommonsChunkPlugin进行代码抽离。最后将output的文件名加上chunkhash`,这样在新打包的文件不会被浏览器缓存策略而缓存

基本配置文件区分静态文件目录

  1. {
  2. test: /\.(png|jpg|gif|ico|swf|xap)$/,
  3. loaders: [
  4. {
  5. loader: 'file-loader',
  6. query: {
  7. name: 'images/[name].[ext]'
  8. }
  9. }
  10. ]
  11. }

主要使用query配置,区分不同文件目录。fonts/media相同道理配置即可

组件区分

  1. ├── bussiness
  2.    └── README.md
  3. └── common
  4. ├── README.md
  5. ├── Template.js
  6. ├── YeomanImage.js
  7. └── button

主要区分业务组件和公共组件。当然你也可以不区分,引用常用的公共库如蚂蚁金服的react前端库,进行改造。如果你需要自己写组件的话,个人愚见还是区分一下。

加入immutable

加入这个看个人意愿,加入之后必定会造成一定的学习以及开发成本,但是对redux来说,运用这个库是再好不过的了,具体表现在数据的不可变性,即每次的数据都会是一个新的,不会在原始引用的数据上进行重新操作,以免造成数据污染。

  1. // reducers/items.js
  2. const initialState = fromJS({
  3. items: [
  4. {
  5. "forum_name": "武汉大学",
  6. "user_level": 12,
  7. "user_exp": 5301,
  8. "id": 30996,
  9. "is_like": 1,
  10. "favo_type": 2
  11. },
  12. // ...
  13. ]
  14. });
  15. function reducer(state = initialState, action) {
  16. switch (action.type) {
  17. case GET_ITEMS:
  18. return state;
  19. default:
  20. return state;
  21. }
  22. }
  23. // views/Home.js
  24. render() {
  25. const list = items.get('items');
  26. // ...
  27. {
  28. list.map((l, index) => {
  29. return (
  30. <tr key={ `list${index}` }>
  31. <td>{ l.get('forum_name') }</td>
  32. <td>{ l.get('user_level') }</td>
  33. <td>{ l.get('user_exp') }</td>
  34. <td>{ l.get('is_like') === 0 ? '是' : '否' }</td>
  35. <td>{ l.get('favo_type') }</td>
  36. </tr>
  37. );
  38. })
  39. }
  40. }

如果不清楚immutable,可以自行百度、谷歌。

使用路由,拆分views文件夹

加入react-router,脚手架中是没有生成路由的(可能有吧,只是楼主没有找到

记一次改造react脚手架的过程的更多相关文章

  1. react脚手架改造(react/react-router/redux/eslint/karam/immutable/es6/webpack/Redux DevTools)

    公司突然组织需要重新搭建一个基于node的论坛系统,前端采用react,上网找了一些脚手架,或多或少不能满足自己的需求,最终在基于YeoMan的react脚手架generator-react-webp ...

  2. 【webpack系列】从零搭建 webpack4+react 脚手架(一)

    搭建一个React工程的方式有很多,官方也有自己的脚手架,如果你和我一样,喜欢刨根究底,从零开始自己一行一行代码创建一个React脚手架项目,那你就来对地方了.本教程是针对React新手,以及对web ...

  3. webpack4构建react脚手架

    create-react-app 脚手架还没有更新到webpack4,但是猛然间发现webpack4已经到 v4.12.0 版本了!!!慌得不行,正好端午有空所以研究了一波,自己搭建了一个简单的rea ...

  4. 前端笔记之React(三)使用动态样式表&antd&React脚手架&props实战

    一.使用动态样式表 1.1 LESS使用 全局安装Less npm install -g less 创建1.less文件,然后可以用lessc命令来编译这个文件: lessc 1.less 1.css ...

  5. 改造 vue-cli 脚手架

    改造 vue-cli 脚手架 注意,这里使用的 vue-cli 的版本为 2.8.2,不同版本的 vue-cli 可能会有些许不一样. 一.配置多页面 项目开发目录: 需要注意一点,每个页面的文件夹命 ...

  6. 【webpack系列】从零搭建 webpack4+react 脚手架(四)

    经过三个章节的学习,你已经学会搭建了一个基于webpack4的react脚手架.如果要更改配置,比如,你希望把编译后的js文件和css文件等单独放dist下的static目录下,你想想,是不是有点麻烦 ...

  7. 用webpack4从零开始构建react脚手架

    用webpack4从零开始构建react脚手架 使用脚手架 git clone git@github.com:xiehaitao0229/react-wepack4-xht.git` `cd reac ...

  8. React脚手架创建一个React应用以及项目目录结构详解

    react脚手架 用来帮助程序员快速创建一个基于xxx库的模板项目,包含了所有需要的配置,指定好了所有的依赖,可以直接安装/编译/运行一个简单效果 react提供了一个专门用于创建react项目的脚手 ...

  9. create-react-app react脚手架

    create-react-app react脚手架 官方脚手架 1.安装 npm install -g create-react-app 2.创建项目 create-react-app react-c ...

随机推荐

  1. JavaScript之“创意时钟”项目

    “时钟展示项目”说明文档(文档尾部附有相应代码) 一.最终效果展示: 二.项目亮点 1.代码结构清晰明了 2.可以实时动态显示当前时间与当前日期 3.界面简洁.美观.大方 4.提高浏览器兼容性 三.知 ...

  2. JDBC工具类实例

    本文以讲解用单利模式实现一个简单的JDBC实用工具类JDBC连接的四个基本步骤:1.加载相应数据库驱动2.建立相应数据库连接3.构建Statement语句,即增删改查SQL语句4.执行Statemen ...

  3. (转)spring事务管理几种方式

    转自:http://blog.csdn.net/jeamking/article/details/43982435 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置 ...

  4. Visual Studio中让一个JS文件智能提示另一个JS文件中的成员

    当一个Web页面引用了两个JS文件(假如分别叫common.js和JScript1.js),如果JScript1.js中需要调用大量的common.js中的方法,这时候在JScript1.js中智能提 ...

  5. 关于在Python下安装布隆过滤器(bloomfilter)的方法

    由于在爬虫代码中需要实现信息的去重功能,所以需借助bloomfilter,在看完各种博客后发现没有安装,这就尴尬了,不会连门都找不到吧.那就安装呗,各种错误,查看官方文档:http://axiak.g ...

  6. Input文本框属性及js

    <input id="txt_uname" maxlength="16" onblur="validata()" onkeyup=&q ...

  7. Spring框架学习之依赖注入

    Spring框架从2004年发布的第一个版本以来,如今已经迭代到5.x,逐渐成为JavaEE开发中必不可少的框架之一,也有人称它为Java下的第一开源平台.单从Spring的本身来说,它贯穿着整个表现 ...

  8. Linux学习(十二)mkpasswd、su、sudo、限制root远程登录

    一.mkpasswd mkpasswd用来生成随机密码字符串.可以指定长度和特殊字符的长度: [root@ruanwenwu01 ~]# mkpasswd O7.alw5Wq [root@ruanwe ...

  9. cocos-Lua中的class与require机制

    cocos-Lua中的class与require机制 local layer = require("PaiGow.src.GamePlayerListLayer")local Ga ...

  10. Windows环境下多线程编程原理与应用读书笔记(2)————面向对象技术

    面向对象技术是学C++需要重点掌握的知识,因为我觉得自己的基础还是比较可以,这一章节的内容就只是粗略的读了一遍,在此就不做过多的笔记.