Giter Club home page Giter Club logo

react-nativescript's Introduction

npm version

React NativeScript is A React renderer for NativeScript, allowing you to write a NativeScript app using the familiar React style.

I'm always hanging out in the #react chat of the NativeScript Discord if you'd like to talk about this project.

Setup

# Make sure that you have `tns` (the NativeScript CLI) installed:
#   https://docs.nativescript.org/start/quick-setup

tns create myApp --react

cd myApp
npm install

# The Preview and Playground apps are awaiting an update from
# RNS v0 to v1, so the `tns preview` workflow isn't supported
# yet. We're working on it. – 18th July 2020
#
# tns preview
# or
tns run ios
# or
tns run android

Documentation

Example real-world app

See the Apps showcase in the docs to see various apps built with React NativeScript.

One example is my rpstrackerrns issue-tracking example app, which demonstrates how you can make fully native, professional-looking UIs with RNS:

Login Page

Backlog Page

Detail Page

Plugins

Although NativeScript lets you write native code inline as JavaScript, you can also write modules purely using native code (e.g. Objective-C and Java), and access the code directly in NativeScript via JavaScript. When a common, cross-platform JavaScript API is provided for such modules, it is called a "plugin", and can be thought of as equivalent to a React Native "native module". NativeScript has a rich ecosystem of these plugins – see the NativeScript Marketplace.

React NativeScript uses the same plugins API as NativeScript Vue and NativeScript Angular, so all those plugins should be compatible (although generally needing to be consumed with any type, as most plugins are only typed for NativeScript Core). Instructions on how to integrate plugins, and provide typings for React, can be found in the React NativeScript plugins documentation.

Why not just use React Native? 🤷‍♂️

React NativeScript shares most of the good parts of React Native, but above all gives a first-class development experience for interacting with native code. Never write another native module again – you can write your native code inline using JavaScript!

React Native

React NativeScript

UI renderer

React

Programming language

JavaScript (with TypeScript typings available)

Platforms

iOS + Android + many more

iOS + Android

Bundler

Metro

Webpack

Codebase

Absolutely unfathomable

Very approachable to new contributors

Javascript VM threading

Separate 'JS' thread

Main (UI) thread

Native API access
Synchronicity

Mostly asynchronous. Typically involves sending JSON-serialisable messages back-and-forth over a native-to-JS bridge. Synchronous only in advanced cases such as JSI and C++ TurboModules, and static values from native modules.

Synchronous: The JS VM has direct bindings to the native context, and sits on the main (UI) thread.

Type marshalling

Only supports JSON-serialisable types[iOS][Android], and only passes by value rather than by reference.

Can marshal nearly any data type[iOS][Android] back and forth between the JS and native contexts, and even passes by reference from native to JS, allowing APIs to be called on native class instances from the JS context. Memory management of native references held by JS is very clever.

Bindings

Users must write their own bindings[iOS][Android] (except possibly for the advanced feature of C++ TurboModules) and try not to get anything wrong.

Bindings between the Objective-C/Java runtimes and JavaScript will be automatically generated[iOS][Android] for any source code included in your app.

Typings

Users must write the typings for their native modules manually[iOS][Android] (except possibly for the advanced feature of C++ TurboModules) and try not to get anything wrong!

Typings can be automatically generated for bindings[iOS][Android], and typings for the whole platform SDK are already provided.

Swift and Kotlin support

For Swift, can write implementation but must expose to React Native via an accompanying Obj-C file and manually-written bindings. Documentation also very limited. Not sure what's involved for Kotlin, but it is supported.

For Swift, just follow a few steps such as adding the @objc tag to the methods, and you're good to go! Not sure what's involved for Kotlin, but it is supported.

UI access

Very limited access to the underlying UI components (e.g. with a ref to a View component, you cannot do much – you can't traverse the UI tree, make synchronous measurements, or call the underlying APIs of the UI component). Exceptions may include the advanced case of Reanimated 2 worklets.

All NativeScript UI elements provide full, synchronous API access to the underlying UI component. e.g. on iOS, with a ref to a React NativeScript <frame> component, you can access the underlying UINavigationController along with all of its APIs and make synchronous UI measurements.

Hot reloading

All native code changes (except possibly JSI and worklets) require app recompilation.

Any native API accesses via JS can be hot reloaded. Native code written in Obj-C / Java does, however, still require an app recompile upon change.

FAQ

Is it production-ready?

It's based on React, NativeScript Core, and NativeScript Vue, which are each individually production-ready. Make of that what you will.

Can this consume React Native projects?

No, but it could with a lot of hard work. Allowing React NativeScript to run projects that were written for React Native is a huge project, but it's theoretically very possible – it would be a project on exactly the same scale as React Native Web. See react-nativescript-compat-react-native for work towards this, where I've ported part of RNTester as a proof-of-concept... 👩‍🔬👨‍🔬

Can this consume React Native native modules?

Certainly not UI-based native modules. But all flavours of NativeScript can consume native code, so it can probably consume React Native native modules, though may take a small bit of refactoring 🤔

Stanisław Chmiela (@sjchmiela) produced a proof-of-concept for importing Expo Unimodules into NativeScript that could be used as a basis for this effort. Original discussion here.

Contributing 🙋‍♀️

Ideally get in contact via the Discord channel before starting any PRs!

react-nativescript's People

Contributors

dependabot[bot] avatar etabakov avatar shirakaba avatar wsedlacek avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

react-nativescript's Issues

Unable to run sample

I have git clone https://github.com/shirakaba/react-nativescript.git then inside sample ran npm install. When I then run the sample: tns run ios --bundle --syncAllFiles --emulator I get the following error:

ERROR in ../node_modules/react-hot-loader/dist/react-hot-loader.development.js
Module not found: Error: Can't resolve 'react-dom' in '/Users/Me/Projects/react-nativescript/sample/node_modules/react-hot-loader/dist'
 @ ../node_modules/react-hot-loader/dist/react-hot-loader.development.js 10:31-51
 @ ../node_modules/react-hot-loader/index.js
 @ ./testComponents/HotApp.tsx
 @ ./app.ts

Inside react-hot-loader-development there is this line var ReactDOM = _interopDefault(require('react-dom'));. I have tried to install react-dom into that node_module but it does not make a difference.

The error is only the first and are followed by other errors.

Declare the app startup fully programmatically

Having troubles understanding NativeScript's UI architecture.

Disregarding the React renderer for the moment, I need to understand how one starts up an app and starts building the UI (I normally do this via the more magical XML route). In this minimal example, the background goes green (the colour of the Page), but I'd expect a purple ContentView to fill the page, too.

Do my components have to be in a Layout container of some sort (note: I did try a variation on this without any more success)? And is there anything further I'm missing?

import { on, run, launchEvent } from "tns-core-modules/application";
import { Frame } from "tns-core-modules/ui/frame/frame";
import { ContentView } from "tns-core-modules/ui/content-view/content-view";
import { TextBase } from "tns-core-modules/ui/text-base/text-base";
import { Page } from "tns-core-modules/ui/page/page";

on(launchEvent, (data) => {
    const frame = new Frame();
    const page = new Page();
    page.backgroundColor = "green";

    const contentView = new ContentView();
    const textBase = new TextBase();
    contentView.height = 100;
    contentView.width = 100;
    contentView.backgroundColor = "purple";
    textBase.text = "Hello, world!";
    contentView._addView(textBase);
    page.bindingContext = contentView;
    
    frame.navigate({ create: () => page });

    data.root = frame; // Incidentally, should this be the frame or the page?
});

run();

Revisit event attachment/detachment

I haven't thought about this for a while and have forgotten what's going on.

  1. Slider doesn't implement updateListeners():

https://github.com/shirakaba/react-nativescript/blob/master/react-nativescript/src/components/Slider.ts

  1. "submit" and "close" are implemented in SearchBar's updateListeners, but only "textChange" is mentioned in its componentDidMount and componentWillUnmount methods.

https://github.com/shirakaba/react-nativescript/blob/master/react-nativescript/src/components/SearchBar.ts

I'd expect Page, View, and EditableTextBase to be reliable prototypes to refer to:

https://github.com/shirakaba/react-nativescript/blob/master/react-nativescript/src/components/Page.ts

https://github.com/shirakaba/react-nativescript/blob/master/react-nativescript/src/components/View.ts

https://github.com/shirakaba/react-nativescript/blob/master/react-nativescript/src/components/EditableTextBase.ts

I'll look into them when I have a moment.

Optimise inactive TabViewItem views

Currently they will continue to trigger renders even when they are not the active TabViewItem. This is easily seen when using the Clock or GameLoopTest components.

Accessing the native component?

I am trying to access the native component of button.ios/textfield.ios etc. But layouts and controls are all undefined in the componentDidMount method.

export default class ComponentExample extends React.Component {
    stackLayoutRef = React.createRef<StackLayout>();
    buttonRef = React.createRef<Button>();

    componentDidMount() {
        console.log("did mount succesfully");
        // both native ios components are undefined...
        console.log("stackLayout " + this.stackLayoutRef.current.ios);
        console.log("and button: " + this.buttonRef.current.ios);
    }

    render() {
        return (
            <$StackLayout ref={this.stackLayoutRef}>
                <$Label text={"This is an example"}/>
                <$TextField text="input"/>
                <$Button ref={this.buttonRef} text="test" backgroundColor={new Color('purple')}/>
            </$StackLayout>
        )
    }
}

Both Frame and Page ios properties can be accessed however.

I have also tried to:

render() {
        return (
            <$StackLayout ref={(ref) => {
                // Intending on assigning ref to instance variable to use inside componentDidMount
                console.log("stackRef: " + ref); // <-- does print: 'stackRef: StackLayout(2)'
                // crash
            }}>
                <$Button text="test" backgroundColor={new Color('purple')}/>
            </$StackLayout>
        )
    } 

But then it crash with the following error: "*** Terminating app due to uncaught exception 'NativeScript encountered a fatal error: TypeError: undefined is not an object (evaluating 'node.on') at". And I get the same error trying it with the Button as well - coming from simply assigning ref with a anonymous method (ref) => { };

How can I for example access the UIButton from the Button in react-nativescript?

Get ReactNativeScript.render() working

ReactNativeScript.render() needs a root node (AKA container) to render into. Thus, I need to get a reference to the application's root view at startup time (which I'll use as the React root). However, I'm facing difficulties:

/* app.ts */
import { on, run, launchEvent, getRootView } from "tns-core-modules/application";

console.log(getRootView());
// application root view is undefined

on(launchEvent, (data) => {
    console.log(data.root);
    // application launch event's data.root is undefined
});
run();

Clearly I am misunderstanding the application lifecycle here. Wondering how I get a reference to the root view (frame) of the app at startup.

References:

Problem using SegmentedBar

I get the following error using $SegmentedBar in my tsx:

UsingSegmentedBar

file:///node_modules/tslib/tslib.es6.js:121:0 JS ERROR TypeError: undefined is not an object (evaluating 'o[Symbol.iterator]')

Append `$` to all exports from "components" directory

From @Lelelo1 on the Slack channel:

I have noticed when creating a custom component - then there is no differentiation beetwen $MyComponent and MyComponent. Couldn't direct access to tns-core-modules/ui be restricted eventually? I have also noticed nativescript components can be imported from these 3 places currently:

import { AbsoluteLayout } from "tns-core-modules/ui/layouts/absolute-layout/absolute-layout";
import { AbsoluteLayout } from "react-nativescript/dist/components/AbsoluteLayout";
import { AbsoluteLayout } from "react-nativescript/dist/client/ElementRegistry";

My response

Regarding component naming

When creating a custom component, you can of course name it whatever you like.

For UI plugins that wrap a UI element (e.g. AbsoluteLayout), my convention is to use the name $AbsoluteLayout to refer to the component class, which prevents a name clash with the underlying UI element that it's wrapping.

For custom components that wrap other React components, there is no 'underlying component' to get a reference to, so there is no need for the $ prefix to prevent a name clash.

Regarding import paths for NativeScript core components

Yeah, the many different import paths are indeed annoying. I re-exported them via ElementRegistry for convenience (just like React Native does), but quite likely I've missed some so you can't get every module you need from there.

There is a long-standing open issue in NativeScript Core to address this.

NativeScript/NativeScript#4041

Actionables

Good point about import { AbsoluteLayout } from "react-nativescript/dist/components/AbsoluteLayout";, though. Any component export under "react-nativescript/dist/components" currently lacks a $ prefix (which is indeed confusing). I'd better address that at some point to prevent the Intellisense auto-importing a React component when the user was intending to import a NativeScript Element...

Hot reload seems unpredictable?

New to Nativescript coming from React Native so maybe my expectations are a little different. I'm noticing a few things that make hot reloading really unpredictable to use.

  1. When enabling a component prop like isScrollEnabled={false} and then removing it from the markup it doesn't reset back to true thus indirectly defaulting to scroll enabled.
  2. Modifying the logic in something like an onTap callback of a button doesn't reflect code changes.

2020-04-05 12-16-04 2020-04-05 12_18_44

I'm just curious if I am doing something wrong or if this is just normal at the moment.

JS ERROR ReferenceError: Can't find variable: process

With a vanilla install I end up getting this when running tns preview I vaguely recall mention about react not guarding process somewhere, maybe that was redux.

2020-04-11 13:29:05.267 nsplaydev[26749:9709575] *** Terminating app due to uncaught exception 'NativeScript encountered a fatal error: ReferenceError: Can't find variable: process
 at 
anonymous(file:///app/tns_modules/react-hot-loader/index.js:3:12)

Template not creating .gitignore and has an .awcache folder.

Sorry if this is another repo or in this repo and I could have linked to the code or even PR'd, I have no idea how nativescript templates work 😬

Anyway, the template has a couple of things missing/included that I wouldn't expect in a more general template or compared to nativescript core's template.

There's a tools/dot.gitignore instead of a typical .gitignore and there's a .awcache folder.

Use CustomNodeHierarchyManager for all components with a custom node hierarchy

This would:

  1. clean up the Host Config, and;
  2. would make it clearer how to produce more complex UI plugins;
  3. also allow subclasses of any NativeScript View to inherit the custom node hierarchy management code of the corresponding React component that they'd naturally extend, thanks to the mixin pattern I've come up with.

Can't set TextField css from nativescript-theme-core

Can't use core themes on components:

<$TextField hint={"test"}
    className={"input input-border input-rounded"}
    onLoaded={(event) => {
        const textField = event.object as TextField;
        textField.className = "input input-border input-rounded";
    }}
/>

Error from react-hot-reload when creating react-nativescript

LOG from device Riz: 2020-03-17 06:07:54.795 nsplaydev[2936:806932] ***** Fatal JavaScript exception - application has been terminated. *****
2020-03-17 06:07:54.795 nsplaydev[2936:806932] Native stack trace:
1   0x10167e970 NativeScript::reportFatalErrorBeforeShutdown(JSC::ExecState*, JSC::Exception*, bool)
2   0x1016c8f58 -[TNSRuntime executeModule:referredBy:]
3   0x10298e25c -[UIApplication(PlayLiveSync) swizzled_executeModule:]
4   0x100ed3524
5   0x18c3a4e18 <redacted>
2020-03-17 06:07:54.796 nsplaydev[2936:806932] JavaScript stack trace:
2020-03-17 06:07:54.796 nsplaydev[2936:806932] anonymous(file:///app/tns_modules/react-hot-loader/index.js:3:12)
at evaluate([native code])
at moduleEvaluation([native code])
at [native code]
at asyncFunctionResume([native code])
at [native code]
at promiseReactionJob([native code])
at require([native code])
at react-hot-loader(file:///app/bundle.js:314:25)
at __webpack_require__(file:///app/runtime.js:751:34)
at fn(file:///app/runtime.js:121:39)
at file:///app/bundle.js:87:93
at ./app.ts(file:///app/bundle.js:172:34)
at __webpack_require__(file:///app/runtime.js:751:34)
at checkDeferredModules(file:///app/runtime.js:44:42)
at webpackJsonpCallback(file:///app/runtime.js:31:39)
at anonymous(file:///app/bundle.js:2:61)
at evaluate([native code])
at moduleEvaluation([native code])
at [native code]
at asyncFunctionResume([native code])
at [native code]
at promiseReactionJob([native code])

When I remove react-hot-reload, everything works as expected. But no hot-reload, so this is a deal breaker...

Fix typings for component props and TSX/JSX

Currently we have a weird situation where the compiler will tell you when your props are simply wrong, but not hint at which props to fill in in the first place.

Have filed a Stack Overflow issue to no avail regarding the specifics of my problem in implementing a solution, but I may have to consult some TypeScript experts to proceed.

Hoping not to have to instruct people to manually add a <reference> tag into their projects.

__ImplementsCustomNodeHierarchyManager__ can only be set to true when implementing CustomNodeHierarchyManager

I am encountering a difficulty in implementing CustomNodeHierarchyManager interface in my rns-reactifiy trial. This is due to the reactify mixin class in my project will need to implement all interfaces and declare all methods currently in use by all rns components - and __ImplementsCustomNodeHierarchyManager__ can only be set to true.

I am not quiet sure of the consequence but I suspected that property enabled at all times is undesirable.

ListView rootKeys are prone to clashing

Easy to see in action simply by using two ListViews in the same app (without unmounting one list prior to mounting the other). Each ListView generates root keys in the same way (using a counter) and those IDs very easily clash between instances.

Consequence: ListView cells appearing as being empty.

So instead, each ListView needs to at least have its own unique key to prefix the root keys we'd otherwise be generating.

Check whether the event handler inheritance between View and ViewBase needs correcting

The abstract <RCTView> (I need to rename it to <$View> for consistency...) class component takes in props for onLoaded and other events. Although they indeed belong to the NativeScript View component, some of the event names (loadedEventName and unloadedEventName, at first glance) also seem to be registered on ViewBase.

https://github.com/shirakaba/react-nativescript/blob/master/react-nativescript/src/components/View.ts#L23

https://github.com/NativeScript/NativeScript/blob/master/nativescript-core/ui/core/view-base/view-base.d.ts#L209

https://github.com/NativeScript/NativeScript/blob/master/nativescript-core/ui/core/view/view.d.ts#L515

I don't know whether this means that ViewBase also supports its own onLoaded and onUnloaded events, but either way, it shall need looking into.

Mobx observable not working in release build

I have used the state management tool MobX in my app and everything has worked in debug - but in release however - MobX observables has stopped working and no more triggering render.

Usage, where I have button:

<$Button ref={this.recordButtonRef} text={"Personuppgifter"} onTap={() => {
    console.log("settin: " + !FormViewModel.get().isHidden);
    FormViewModel.get().isHidden = !FormViewModel.get().isHidden;
}}
/>

Where the FormViewModel is synonymous to a "Store":

@observable
isHidden = true;

And a form is rendered depending on the value of isHidden:

renderForm() {
    return FormViewModel.get().isHidden ? null : ( 
        <$CardView
            forwardedRef={this.cardViewRef}
            margin={10}
            borderWidth={2} 
            shadowOffsetHeight={2}
            shadowOffsetWidth={1}
            className={"cardStyle"}
         >
         <Form ref={this.formRef} />
     </$CardView>
            
        );
    }

Note that most of the app was developed without rns-reactify and those parts has also stopped functioning where they are using mobx observable. I am never calling setState in my app - using mobx instead.


My dependencies are the following:

"dependencies": {
"@nstudio/nativescript-cardview": "^1.0.0",
"@nstudio/nativescript-checkbox": "^1.0.0",
"mobx": "^5.13.0",
"mobx-react": "^6.1.3",
"nativescript-carousel": "^6.1.0",
"nativescript-cfalert-dialog": "^1.0.15",
"nativescript-contacts": "^1.6.2",
"nativescript-email": "^1.5.5",
"nativescript-floatingactionbutton": "^5.1.0",
"nativescript-iqkeyboardmanager": "^1.5.1",
"nativescript-theme-core": "^1.0.6",
"nativescript-toasty": "^2.0.1",
"react": "^16.9.0",
"react-nativescript": "^0.12.0",
"rns-reactify": "git+https://github.com/Lelelo1/rns-reactify.git",
"tns-core-modules": "6.0.1",
"tns-platform-declarations": "^6.0.6"
},
"devDependencies": {
"@babel/core": "^7.5.0",
"@babel/plugin-proposal-class-properties": "^7.5.0",
"@babel/preset-react": "^7.0.0",
"@types/react": "^16.9.2",
"awesome-typescript-loader": "^5.2.1",
"babel-loader": "^8.0.6",
"fork-ts-checker-webpack-plugin": "^1.3.7",
"nativescript-dev-webpack": "1.0.1",
"react-nativescript-hot-loader": "git+https://github.com/shirakaba/react-nativescript-hot-loader.git",
"typescript": "3.4.5"
},

Provide a starter template to ease adoption

Obviously the installation instructions are horrific. Would love to circumvent this with a NativeScript CLI starter template. Will have to get in contact with the team for that.

Build error when generating android apk with nativescript sidekick

First of all I had to downgrade node to be able to start the build process with nativescript sidekick.

When building apk in release I get the following error

(CLI) TypeError: Cannot read property 'dispatch' of undefined
node_modules/fork-ts-checker-webpack-plugin/src/index.ts:690:60

Build failed. Executing webpack failed with exit code 1.

I have noticed that the "fork-ts-checker-webpack-plugin": "^1.3.7" module which is a dependency of my react-nativescript app has a node_modules/fork-ts-checker-webpack-plugin/lib/index path, not node_modules/fork-ts-checker-webpack-plugin/src/index.

I have the following webpack in my package.json: "nativescript-dev-webpack": "1.0.1"

Consider providing generic onPropertyChange() prop to enable listening to any property change

From a discussion with triniwiz, on Slack:

triniwiz: everything that is an instance of the property u can bind to it like propName + change
triniwiz: Property is from ui/core/view
myself: So can you even listen for events fired in response to styles (e.g. left) changing?
triniwiz: I have tried but something like borderRadiusChange

... To be honest, I'm not sure whether such a feature is necessary in React NativeScript, because after all React makes everything declarative to begin with. Want to record this information so that it doesn't become lost, in any case.

JS ERROR Error: Cannot find module after tns migrate

When tns run ios --no-hmr- I encountered the prompt to update:

prompt

So I ran tns migrate - but it created an error:

file:///app/app.ts:1:74 JS ERROR Error: Cannot find module './AppContainer'

...That wouldn't go away. I made sure the export and import where correct - and had made no recent edits to the code.


It was solved by copying the old tsconfig.tns.json and webpack.config.js into the migrated project version - since I read the tns upgrade made edits to those files

The role of the ElementRegistry?

I went back to the first commits made to the repo and saw it was the first file created - separate from the index file.

It's purpose (?) seem to have been to supply HostConfig with the NativeScript components. Currently tough when wrapping plugins - there also seems to be a necessary register() call to the element registry.

So it is not only a practical way of handling the ns imports?

Additionally I am tempted to grab all ns imports via the elements registry - as the imports then simply becomes more readable and coherent:

ElementRegistry

I assume there is no harm in doing that?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.