private void Reconfigure()
        {
            IDisposable oldpool;

            using (var cfg = new ReactConfiguration())
            {
                Configure(cfg);
                lock (this)
                {
                    if (watcher != null)
                    {
                        watcher.StopNotify();
                    }
                    oldpool       = (IDisposable)_ReactPool;
                    _ReactPool    = cfg.GetReactPool();
                    watcher       = cfg.Watcher;
                    Preprocessor  = cfg.PreprocessorFunction;
                    Postprocessor = cfg.PostprocessorFunction;
                    if (watcher != null)
                    {
                        watcher.StartNotify(this.Reconfigure);
                    }
                }
            }
            if (oldpool != null)
            {
                oldpool.Dispose();
            }
        }
Esempio n. 2
0
 internal JsEngine(JsEnginePool pool, int nr)
 {
     Contract.Assert(pool != null, nameof(pool) + " is null.");
     Pool         = pool;
     SerialNumber = nr;
     SetContext(null);
 }
 void IDisposable.Dispose()
 {
     if (BabelPool != null)
     {
         ((IDisposable)BabelPool).Dispose();
     }
     BabelPool = null;
 }
 /// <summary>
 /// Freeze the Babel <see cref="ScriptRepository"/> and create a <see cref="JsEnginePool"/> for JSX to JS compilation with Babel.
 /// </summary>
 /// <returns>A <see cref="JsEnginePool"/> with initialized Babel, ready for compiling JSX to JS</returns>
 private JsEnginePool GetBabelPool()
 {
     LoadExternalScripts();
     if (BabelPool == null)
     {
         BabelPool      = new JsEnginePool(BabelRepository);
         BabelPool.Name = "BabelPool";
     }
     return(BabelPool);
 }
 internal JsEnginePool GetReactPool()
 {
     LoadExternalScripts();
     if (ReactPool == null)
     {
         ReactPool = new JsEnginePool(ReactRepository)
         {
             Name = "ReactPool"
         };
     }
     return(ReactPool);
 }
Esempio n. 6
0
        public static void SayHello()
        {
            Console.WriteLine("Hello from Core");
            var JSX = "var HelloWorld = React.createClass({  render() { return (<div>Hello {this.props.name}!</div>); }  });";

            // preparation phase
            var rt = new ReactRuntime(cfg => {
                cfg.ScriptContentLoader = (s => s); // we load literals for now, not files.
                cfg.AddJsx(JSX);
            });

            // runtime phase
            using (var engine = rt.ReactPool.Engine)
            {
                var o1 = engine.Evaluate("ReactDOMServer.renderToStaticMarkup(React.createElement(HelloWorld, { name: \"Mike Meyers\" }))");
                Console.WriteLine(o1);
                var o2 = engine.Evaluate("ReactDOMServer.renderToString(React.createElement(HelloWorld, { name: \"Mike Meyers\" }))");
                Console.WriteLine(o2);

                var rr = rt.RenderToStaticMarkup("HelloWorld", new { name = "World using engine" }, engine);
                Console.WriteLine(rr.render);
            }

            var sw = Stopwatch.StartNew();
            var r  = rt.RenderToStaticMarkup("HelloWorld", new { name = "World" });

            sw.Stop();
            Console.WriteLine("{0} in {1}", r.render, sw.Elapsed); // 1.6ms on my i7 machine


            Console.WriteLine("Compiling {0} ...", JSX);
            var babel = new ScriptLoader();

            babel.AddUrl("https://unpkg.com/babel-standalone@6/babel.min.js");
            babel.AddUrl("https://unpkg.com/babel-polyfill@6/dist/polyfill.min.js");
            var babelRepository = babel.GetRepository();

            babelRepository.AddAssetResource("ArrayConverter.js"); // function convertToJsArray(host)
            babelRepository.AddAssetResource("JSX.js");            // function transformCode(code, url), function transformCode__2()
            using (var babelPool = new JsEnginePool(babelRepository))
                using (var e = babelPool.Engine)
                {
                    var compiled = e.Evaluate("transformCode", JSX);
                    Console.WriteLine(compiled);
                }


            /* For JSX see https://gist.github.com/zpao/7f3f2063c3c2a39132e3 , https://github.com/babel/babel-standalone
             * and https://github.com/facebook/react/issues/5497
             * all these use babel-standalone and even the babl REPL Website https://babeljs.io/repl
             * so we do too.
             * We need the function transformCode(code, url) from the gist as well as the var babelOpts, see below
             */
            var c  = "\"use strict\"; var HelloWorld = React.createClass({ displayName: \"HelloWorld\",  render: function render() { return React.createElement(\"div\", null, \"Hello \", this.props.name, \"!\"); } }); ";
            var sl = new ScriptLoader();

            sl.AddUrl("https://unpkg.com/react@15/dist/react.min.js");
            sl.AddUrl("https://unpkg.com/react-dom@15/dist/react-dom.min.js");
            sl.AddUrl("https://unpkg.com/react-dom@15/dist/react-dom-server.min.js");
            var repository = sl.GetRepository();

            repository.AddAssetResource("ArrayConverter.js"); // function convertToJsArray(host)
            repository.AddScriptContent("var sm = 3; var square = ( a => a*a );", "Test");
            repository.AddScriptContent(c, "HelloWorld");
            using (var pool = new JsEnginePool(repository))
            {
                int n  = 10;
                var cd = new CountdownEvent(n);
                ThreadPool.SetMinThreads(8, 200);
                for (var i = 0; i < n; i++)
                {
                    var ii = i;
                    ThreadPool.QueueUserWorkItem(
                        (o) =>
                    {
                        using (var e = pool.Engine)
                        {
                            e.Calc2(ii);
                        }
                        cd.Signal();
                    }, null);
                }
                cd.Wait();
                Console.WriteLine("completed");
            }
        }
 /// <summary>
 /// Create a runtime with a static prefabricated <see cref="JsEnginePool"/>.
 /// This is a low level method to create a runtime e.g. without loading ReactJS and/or Babel.
 /// Runtimes created with this constructor can't be refreshed inline.
 /// </summary>
 /// <param name="reactPool">A <see cref="JsEnginePool"/> that can run ReactDOMServer methods, has ReactJS classes and our JS function PrepareReact/2.</param>
 public ReactRuntime(JsEnginePool reactPool)
 {
     Contract.Assert(reactPool != null, nameof(reactPool) + " is null.");
     _ReactPool = reactPool;
     Configure  = null;
 }