(一)前言
一个完整的web开发手脚架,应该包含以下

  • babel-loader 图片 音视频 字体 样式处理等loader
  • 开发环境配置
  • 生产环境配置,流程化前端多生产构建
  • 生产环境打包优化, 如构建速度,打包外链库,抽离公共模块,页面切片处理(代码内部),
  • git commit 检查规范 和 eslint配置

(二)新增eslint配置

  1. 采用eslint-config-airbnb规范

安装依赖

$  yarn add babel-eslint eslint eslint-config-airbnb eslint-loader eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react eslint-plugin-react-native --dev
  1. 在根文件下新增.eslintrc文件
{"parser": "babel-eslint","parserOptions": {"ecmaVersion": 7,"sourceType": "module","ecmaFeatures": {"jsx": true,"modules": true}},"extends": "airbnb","env": {"es6": true},"plugins": ["react","react-native","jsx-a11y","import"],"globals": {"__DEV__": true,"__dirname": false,"__fbBatchedBridgeConfig": false,"alert": false,"cancelAnimationFrame": false,"cancelIdleCallback": false,"clearImmediate": true,"clearInterval": false,"clearTimeout": false,"console": false,"document": false,"escape": false,"Event": false,"EventTarget": false,"exports": false,"fetch": false,"FormData": false,"global": false,"jest": false,"Map": true,"module": false,"navigator": false,"process": false,"Promise": true,"requestAnimationFrame": true,"requestIdleCallback": true,"Set": true,"setImmediate": true,"setInterval": false,"setTimeout": false,"window": false,"XMLHttpRequest": false,"pit": false},"settings": {"import/resolver": {"babel-module": {}}},"rules": {"no-underscore-dangle": ["error", { "allow": ["__APP__", "__ANDROID__", "__IOS__", "_root"] }],"react/jsx-filename-extension": [1,{"extensions": [".js",".jsx"]}],"import/no-extraneous-dependencies": ["error",{"devDependencies": true}],"import/prefer-default-export": 0,"react/no-unused-prop-types": 0,"jsx-a11y/no-static-element-interactions": 0,"no-bitwise": "off","no-param-reassign": "off","max-len": [0,160,4],"arrow-parens": [2,"as-needed",{"requireForBlockBody": true}],"guard-for-in": "off","no-restricted-syntax": ["error","BinaryExpression[operator='in']"],"react/prefer-stateless-function": [0],"global-require": [0]}
}

配置eslint和修复命令请 参考这里

  1. package.json新增加script命令
$ "lint": "eslint \"src/**/*.{js,jsx}\" --quiet",
  1. 自己根据eslint, 修复src/App.js
    运行命令检查
$ yarn lint

(三) 增加webpack配置
将环境默认为dev,prod,base使用webpack-merge连接,然后运行不同的打包命令。

  1. 安装依赖
$ yarn add happypack copy-webpack-plugin html-webpack-include-assets-plugin webpack-merge open-browser-webpack-plugin webpack-bundle-analyzer webpack-parallel-uglify-plugin clean-webpack-plugin env-cmd --dev$ yarn add @babel/polyfill
  1. 更新webpack配置文件

    代码太多,最后点demo看吧

  2. 在根文件夹下新建.env-cmdrc文件,这里是环境参数配置

{"start:dev": {"NODE_ENV": "development","BABEL_ENV": "development","OUTPUT_DIR": "dist","IS_WEB": "1"},"build:staging": {"NODE_ENV": "production","BABEL_ENV": "production","OUTPUT_DIR": "dist-staging","IS_WEB": "1"},"build:prod": {"NODE_ENV": "production","BABEL_ENV": "production","OUTPUT_DIR": "dist-prod","IS_WEB": "1"}
}
  1. package.json新增加script命令
 "setup-web": "yarn && yarn build-dll","build-dll": "webpack --config web-build/webpack_dll.config.js --mode production","dev": "webpack-dev-server --progress --colors --config web-build/webpack.dev.js","start-web": "env-cmd start:dev yarn dev","start-b": "BUNDLE=1 yarn start","release": "webpack --progress --colors --config build/web-build.prod.js --profile --json > stats.json","build-s": "env-cmd build:staging yarn release","build-p": "env-cmd build:prod yarn release"

我简要说明下目前scripts命令

在web首先使用setup-web生成react动态连接库
start-web 为开发环境命令
start-b 为开发下分析打包大小命令
build-s 为生成staging环境包命令
build-p 为生成production环境包命令

(四) git commit检查

  1. 安装依赖
$ yarn add pre-commit --dev
  1. package.json新增加script命令
"scripts": {"precommit-msg": "echo 'Pre-commit checks...' && exit 0","lint": "eslint \"src/**/*.{js,jsx}\" --quiet","start": "node node_modules/react-native/local-cli/cli.js start","setup": "yarn && cd ios && pod install && cd .. && react-native link","android": "react-native run-android","iPhoneX": "react-native run-ios --simulator 'iPhone X'","clear": "watchman watch-del-all && rm -rf $TMPDIR/react-* && rm -rf node_modules/ && yarn && yarn start -- --reset-cache","test": "jest","setup-web": "yarn && yarn build-dll","build-dll": "webpack --config web-build/webpack_dll.config.js --mode production","dev": "webpack-dev-server --progress --colors --config web-build/webpack.dev.js","start-web": "env-cmd start:dev yarn dev","start-b": "BUNDLE=1 yarn start","release": "webpack --progress --colors --config build/web-build.prod.js --profile --json > stats.json","build-s": "env-cmd build:staging yarn release","build-p": "env-cmd build:prod yarn release"},"pre-commit": ["precommit-msg","lint"],

这样,在每次我们commit都会触发yarn lint命令,去检查代码规范, 当然,如果如果有漏掉的报错,能一次直接屏蔽,避免在pr过程还有这种小错误

(五)路由处理 和 页面分层

上一章也说到了其实web和react native的路由核心不一样,而且官网维护的react native路由库本身也不是最优的选择,所以我们还是选择react-navigation,web当前是4的react-router-dom

安装过程大体就不说了

再说下页面分层,我们在src下的分层如下

  • assets 为静态文件夹
  • components 为通用组件,为两端提供共用组件
  • config 配置文件
  • constants 常量文件夹
  • modals mobx store 做业务逻辑处理
  • pagesRn react-native 路由配置
  • pagesWeb web 路由配置
  • services 服务api
  • utils 工具库
  • index.rn.js react-native 入口
  • index.web.js web 入口

我说下我为什么要采用pagesRn/pagesWeb两个文件夹分别处理路由。

  1. 路由库不一样
  2. 一般组件是分为两种,一种是components内的通用组件,另一个是在pages内部维护的当前页面独有的components,所以,我们将要兼容两端的就写在components内部,如果只是当前端独有的就在对应的模块新建一个components作为私有组件维护,
  3. css in js 是react-native样式,但是社区提供一个styled-components的库,能用css in js方式,也同时支持web和react native两端的样式写法

(六)结论

目前只给了一个项目的雏形,实际开发中肯定还会遇到很多其他问题,但是也可以作为一种跨平台的参考了,当然,如果你喜欢html的方式,可以选择ionic3的方式

Demo 地址

React Native三端同构(二: webpack@4脚手架构建和项目代码规范)相关推荐

  1. React Native三端同构

    React Native三端同构,即iOS.Android.Web共用一套代码,已知React Native已经支持iOS.Android,所以只需要做支持Web的工作就行了. 如何同构 我们可以利用 ...

  2. React Native 三端同构实战

    WeiboGoogle+用电子邮件发送本页面 0 React Native 三端(Web.iOS.Android)同构是指在不改动原 React Native 的代码下,让其在浏览器中运行出和在 Re ...

  3. React Native 三端同构实践

    ⚠️ 博客中涉及的代码内容可查看 Github: react-native-isomorphism React Native三端同构皆在

  4. React Native三端融合在沪江的应用实践

    内容来源:2017年3月11日,沪江web前端开发工程师陈达孚在"中生代技术&iTechPlus年度大会(上海)"进行<基于react native三端融合的应用和实 ...

  5. react native Android端保持APP后台运行--封装 Headless JS

    react native Android端保持APP后台运行--封装 Headless JS 前些日子在做后台下载时踩了后台运行这个大坑,RN官网文档上面在安卓上提供了Headless JS方法,iO ...

  6. 为什么学习React Native三点原因

    React Native不到两岁,兼容Android平台刚刚1年.我学习React Native其实也就不到1年,不算长,也不算短. Paul Graham在文章中写过:大多数人真正注意到你的时候,不 ...

  7. React Native开发总结(二)

    58车商通RN落地实践 引言 开发已经经历了几个阶段,从Native App 到 WebApp大火,再到苹果公司禁Web,又发展到了Hybrid的Web与原生共生.再到React Native,这种利 ...

  8. React Native + react-native-camera 实现扫描二维码「安卓」

    注:本篇博客参考了此篇:React Native实现扫描二维码功能基于react-native-camera 感谢 孙先森i 的分享:也感谢引用的其他博客的作者:我也来加块砖: 这篇博客用于自我记录和 ...

  9. React Native入门(十二)之使用第三方字体文件

    前言 项目中需要展示一些别的平面或者其他民族文字时,需要使用该文字对应的字体文件,一般来说都是.ttf的. 在React Native中,使用字体文件就是在style中设置fontFamily属性! ...

最新文章

  1. Rect 选择感兴趣区域
  2. iOS-获取通讯录联系人信息
  3. Maven项目中获取classpath和资源文件的路径
  4. 在线场景感知:图像稀疏表示-ScSPM和LLC总结(lasso族、岭回归)
  5. linux 内核主线,为AM335x移植Linux内核主线代码(41)Ethernet结论篇
  6. Linux概述及centos版本介绍和下载地址
  7. 【IoT最佳实践】设备获取实时天气信息
  8. SQL Server触发器创建、删除、修改、查看示例步骤
  9. html猜随机数游戏,用js制作简易计算器及猜随机数字游戏
  10. 临时设置mysql数据库最大连接数,重启后需重新设置
  11. 公告:下载频道C币系统上线(暂行版)
  12. 逃出你的肖申克(五):看不见的牢笼(上)
  13. Win10安装WSL-Ubuntu18.04
  14. 图片文字介绍滑动效果代码介绍
  15. sed实现key-value变量替换
  16. excel更改页眉页脚_如何在Excel的页眉和页脚中键入“&”号
  17. 交互设计:界面尺寸设计大全
  18. Java软件工程师 (职业简介)
  19. 将网页分享到微信带有缩略图和简介
  20. scrapy源码3:scraper的源码分析

热门文章

  1. 入门系列:基础认知——main函数参数说明
  2. BUUCTF刷题记录 Ping Ping Ping
  3. 内网渗透研究:LLMNR和NetBIOS欺骗攻击分析
  4. C语言-字符串的定义及使用
  5. linux 降低gcc版本,如何降低自己的gcc版本
  6. vivado ip核锁定问题
  7. 最新电子信息工程毕业设计项目推荐
  8. leetcode827. 最大人工岛 - 垃圾代码,毫无优化
  9. 奖状如何批量打印出来
  10. 不会安装该公布程序,因为它可能不安全,请与管理员联系,将程序包的安装用户界面选项更改为基本