ptmt / react-native-macos

[deprecated in favor of https://microsoft.github.io/react-native-windows/] React Native for macOS is an experimental fork for writing desktop apps using Cocoa
MIT License
11.25k stars 429 forks source link

Compatibility with react-native-typescript-transformer #194

Open acuntex opened 6 years ago

acuntex commented 6 years ago

Description

I have an existing project with which i create an android, ios and windows-app (react-native-windows). This project uses "react-native-typescript-transformer" to use TypeScript as language. I've integrated react-native-macos as explained in other issues, with modifications for the rn-cli.config.js and .babelrc. When trying to run the app, the metro builder crashed with the following error:

Bundling `index.macos.js`  ░░░░░░░░░░░░░░░░  0.0% (0/124)/path/node_modules/react-native-macos/packager/src/JSTransformer/worker/worker.js:116
    code = code.replace(/^#!.*/, '');
                ^

TypeError: Cannot read property 'replace' of undefined
    at transformCode (/path/node_modules/react-native-macos/packager/src/JSTransformer/worker/worker.js:116:17)
    at exports.transformAndExtractDependencies (/path/node_modules/react-native-macos/packager/src/JSTransformer/worker/worker.js:149:3)
    at handle (/path/node_modules/react-native-macos/packager/src/worker-farm/lib/child/index.js:51:8)
    at process.<anonymous> (/path/node_modules/react-native-macos/packager/src/worker-farm/lib/child/index.js:57:3)
    at process.emit (events.js:180:13)
    at emit (internal/child_process.js:783:12)
    at process._tickCallback (internal/process/next_tick.js:178:19)
 ERROR  Channel closed
Error [ERR_IPC_CHANNEL_CLOSED]: Channel closed
    at ChildProcess.target.send (internal/child_process.js:599:16)
    at Object.send (/path/node_modules/react-native-macos/packager/src/worker-farm/lib/fork.js:30:15)
    at Farm.stopChild (/path/node_modules/react-native-macos/packager/src/worker-farm/lib/farm.js:135:11)
    at Farm.<anonymous> (/path/node_modules/react-native-macos/packager/src/worker-farm/lib/farm.js:102:10)
    at ontimeout (timers.js:466:11)
    at tryOnTimeout (timers.js:304:5)
    at Timer.listOnTimeout (timers.js:267:5)

Somehow I believe the transformers are not compatible with the babel-plugins replacing the import of react-native.

module.exports = {
//... react-native-macos patches
  getTransformModulePath() {
    return require.resolve('react-native-typescript-transformer');
  },
  getSourceExts() {
    return ['ts', 'tsx'];
  }
}

Reproduction Steps and Sample Code

Install "react-native-typescript-transformer" according to https://github.com/ds300/react-native-typescript-transformer in a fresh react-native-macos project and import a ts file. (you have to install react-native, too, and add the patches needed for the rn-cli.config.js and .babelrc)

Additional Information

ptmt commented 6 years ago

Thanks for reporting this. Just wanted to let you know, I've read this, but don't have a solution yet, need some time to debug.

shirakaba commented 6 years ago

I have reproduced this too:

rn-cli.config.js

Note that I didn't include any of the react-native-macos patches yet.

module.exports = {
    getTransformModulePath() {
        return require.resolve('react-native-typescript-transformer');
    },
    getSourceExts() {
        return ['ts', 'tsx'];
    }
};

package.json

{
    "name": "MyProject",
    "version": "0.0.1",
    "private": true,
    "scripts": {
        "start": "node node_modules/react-native-macos/local-cli/cli.js start",
        "ios": "react-native run-ios",
        "android": "react-native run-android",
        "macos": "react-native-macos run-macos",
        "test": "jest"
    },
    "dependencies": {
        "react": "16.0.0-alpha.12",
        "react-native": "^0.55.3",
        "react-native-macos": "0.16.1"
    },
    "devDependencies": {
        "@types/react": "^16.3.13",
        "@types/react-native": "^0.55.12",
        "babel-jest": "22.4.3",
        "babel-preset-react-native": "4.0.0",
        "jest": "22.4.3",
        "react-native-typescript-transformer": "^1.2.5",
        "react-test-renderer": "16.0.0-alpha.12",
        "typescript": "^2.8.3"
    },
    "jest": {
        "preset": "react-native-macos"
    }
}

tconfig.json

{
  "compilerOptions": {
    "target": "es2015",
    "module": "es2015",
    "jsx": "react-native",
    "baseUrl": ".",
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true
  }
}

index.macos.js

import React, { Component } from 'react';

import { AppRegistry, StyleSheet, Text, View } from 'react-native';
import TSDemo from "./TSDemo";

export default class MyProject extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>
          Welcome to React Native macOS!
        </Text>
        <Text style={styles.instructions}>
          To get started, edit index.macos.js
        </Text>
        <TSDemo/>
        <Text style={styles.instructions}>
          Press Cmd+R to reload,{'\n'}
          Cmd+D for dev menu
        </Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
  instructions: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
  },
});

AppRegistry.registerComponent('MyProject', () => MyProject);

The TypeScript module, TSDemo.tsx

import React, {Component} from "react";
import {Text} from "react-native";

export default class TSDemo extends Component<{}, {}> {
    render(){
        return <Text>TYPESCRIPT WORKING</Text>
    }
}

I will continue to investigate this, but I haven't made any progress in the last few hours; anything involving debugging the packager is beyond me.

shirakaba commented 6 years ago

Note to all: Although I can't get react-native-typescript-transformer working, we can at least still develop with TypeScript:

react-native-macos init MyProject
cd MyProject
# npm install --save-dev @types/react @types/react-native typescript
yarn add --dev @types/react @types/react-native typescript
touch tsconfig.json
open macos/MyProject.xcodeproj

Now add the following to tsconfig.json:

{
  "compilerOptions": {
    "target": "es2015",
    "module": "es2015",
    "jsx": "react-native",
    "lib": ["ES5", "ScriptHost", "ES2015.Collection"], // Standard ES5 libs
    "baseUrl": ".",
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true
  }
}

Now, run the following to automatically transpile .ts(x) files to .js:

node_modules/.bin/tsc --watch

... Then, with MyProject.xcodeproj open, Run the My Mac target.

Hot module reloading even works (from the React Native menu, just select Enable Hot Reloading).

acuntex commented 6 years ago

@shirakaba But it's pretty hacky :(

Last time i used this manual approach referenced Assets were not copied.