react-web使用

项目中使用到了react-web, 有空记录下使用步骤.

react-web是淘宝前端团队开发的一个可以把react-native转换成web的工具, 大体上能实现了移动端的iOS/安卓/移动web这三端的代码共用. 当然细节上是充满了各种有解无解的坑.

安装

  1. 安装命令行工具react-web-cli: npm install react-web-cli -g

  2. package.json文件里添加以下内容后npm install

    "dependencies": {
        ...
        "react-dom": "15.3.x",
        "react-web": "0.4.6"
    },
    "devDependencies": {
        ...
        
        "babel-loader": "^6.2.5",
       "babel-preset-react-native": "^1.9.0",
       "babel-preset-stage-1": "^6.16.0",
       "haste-resolver-webpack-plugin": "^0.2.2",
       "json-loader": "^0.5.4",
       "react-hot-loader": "^1.3.0",
       "webpack": "^1.13.2",
       "webpack-dev-server": "^1.16.1",
       "webpack-html-plugin": "^0.1.1"
    }
    
  3. 项目目录下创建web文件夹, 里面创建webpack.config.js文件, 内容:

    'use strict';
    
    var path = require('path');
    var webpack = require('webpack');
    var HtmlPlugin = require('webpack-html-plugin');
    var HasteResolverPlugin = require('haste-resolver-webpack-plugin');
    
    var IP = '0.0.0.0';
    var PORT = 3000;
    var NODE_ENV = process.env.NODE_ENV;
    var ROOT_PATH = path.resolve(__dirname, '..');
    var PROD = 'production';
    var DEV = 'development';
    let isProd = NODE_ENV === 'production';
    
    var config = {
      paths: {
        src: path.join(ROOT_PATH, '.'),
        index: path.join(ROOT_PATH, 'index.web'),
      },
    };
    
    var webpackConfig = {
      ip: IP,
      port: PORT,
      devtool: 'cheap-module-eval-source-map',
      resolve: {
        alias: {
          'react-native': 'ReactWeb',
        },
        extensions: ['', '.js', '.web.js', '.ios.js', '.android.js', '.native.js', '.jsx'],
      },
      entry: isProd ? [
        config.paths.index
      ] : [
        'webpack-dev-server/client?http://' + IP + ':' + PORT,
        'webpack/hot/only-dev-server',
        config.paths.index,
      ],
      output: {
        path: path.join(__dirname, 'output'),
        filename: 'bundle.js'
      },
      plugins: [
        new HasteResolverPlugin({
          platform: 'web',
          nodeModules: ['react-web']
        }),
        new webpack.DefinePlugin({
          'process.env': {
            'NODE_ENV': JSON.stringify(isProd ? PROD : DEV),
          }
        }),
        isProd ? new webpack.ProvidePlugin({
          React: 'react'
        }) : new webpack.HotModuleReplacementPlugin(),
        new webpack.NoErrorsPlugin(),
        new HtmlPlugin(),
      ],
      module: {
        loaders: [{
          test: /\.json$/,
          loader: 'json',
        }, {
          test: /\.jsx?$/,
          loader: 'react-hot',
          include: [config.paths.src],
          exclude: [/node_modules/]
        }, {
          test: /\.jsx?$/,
          loader: 'babel',
          query: {
            presets: ['react-native', 'stage-1']
          },
          include: [config.paths.src],
          exclude: [path.sep === '/' ? /(node_modules\/(?!react-))/ : /(node_modules\\(?!react-))/]
        }]
      }
    };
    webpackConfig.resolve.alias[path.basename(ROOT_PATH, '.')] = path.join(ROOT_PATH, '.');
    
    module.exports = webpackConfig;
    
  4. 项目目录下创建index.web.js文件, 把index.ios.js内容copy过来, 在最后加上以下代码:

    if (Platform.OS == 'web') {
      var app = document.createElement('div');
      document.body.appendChild(app);
      AppRegistry.runApplication('Helloworld', {
        rootTag: app
      });
    }
    
  5. 在项目目录下命令react-web start, 成功后在浏览器打开http://localhost:3000就能看到了.

    • 如果发生报错 ERROR in Path must be a string. Received undefined, 是因为你的node版本太高,使用node 5点几 4点几就好了.
  • 在浏览器上运行是这样的:

  • 当前项目目录变成这样:

测试并打包 Web 版本代码

  • 打包html: react-web bundle

    • 打包完成后,文件会存放在 web/output/ 目录下面.
    • 安装有http-server工具的可以在output文件夹下命令http-server, 再在浏览器输入http://127.0.0.1:8080/就能看到了.

本例代码 GitHub

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • GitChat技术杂谈 前言 本文较长,为了节省你的阅读时间,在文前列写作思路如下: 什么是 webpack,它要...
    萧玄辞阅读 12,662评论 7 110
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 webpack介绍和使用 一、webpack介绍 1、由来 ...
    it筱竹阅读 11,019评论 0 21
  • 无意中看到zhangwnag大佬分享的webpack教程感觉受益匪浅,特此分享以备自己日后查看,也希望更多的人看到...
    小小字符阅读 8,125评论 7 35
  • 其实余罪的身上有一半的我,一半的你。真实的我,和我向往的真实的你。
    Vera微辣阅读 457评论 0 0
  • 1.使用使用编译器提供的宏来操作 2.关闭某一个指定文件的某种指定类型的警告 双击 文件, 在其中添加 -Wno...
    MisterZhai阅读 425评论 0 0