On Fri, Nov 24, 2017 at 11:13 AM, Svein-Erik Løken <sv...@jacilla.no> wrote:
Hello! Trying to use TypeScript and React with Tapestry: > > In TypeScript I need to use: import * as React from "react"; > > I would like to load react: react.min, so I have to set paths: {...} > > The configuration should be set at startup, but I cannot figure how to do > it. I can set requirejs.config.shim, but not paths. > Are you using React in all pages or just some of them? > > I tried to load it with @Contribute(ModuleManager.class), but could not > figure out how. > > PSEUDO CODE > @Contribute(ModuleManager.class) > public static void setupMyBaseModules(MappedConfiguration<String, Object> > configuration) { > JSONObject pathsConfig = new JSONObject( > "react", "react.min", > "react-dom", "react-dom.min" > ); > AMDResourceConfiguration paths = new AMDResourceConfiguration("paths", > pathsConfig); > configuration.add(null, new JavaScriptModuleConfiguration(paths)); > } > MappedConfiguration, as far as I can remember, doesn't accept null as the contribution id. Even if it does, it's a bad idea. > Tried to load it this way: > @Startup > public void registerToClearPlasticProxyFactoryOnInvalidation(JavaScriptSupport > javaScriptSupport) { > ModuleConfigurationCallback callback = new > ModuleConfigurationCallback() { > @Override > public JSONObject configure(JSONObject configuration) { > configuration.put("paths", > new JSONObject( > "react", "react.min", > "react-dom", "react-dom.min" > )); > return configuration; > } > }; > javaScriptSupport.addModuleConfigurationCallback(callback); > } > [ERROR] ioc.Registry org.apache.tapestry5.ioc.util.UnknownValueException: > No object of type org.apache.tapestry5.services.javascript.JavaScriptSupport > is available from the Environment. I'm afraid this isn't the correct way of using JavaScriptSupport.addModuleConfigurationCallback(). It should be used while rendering a page or handling an event. The way you did it above, you're trying to add JavaScript at application startup. You need to do this in page or component classes. > Now I am loading the configuration in @SetupRender, but it should be > loaded globally. > Define "globally", please. All pages, including error ones? Most pages? The better way of doing this is moving this code to a mixin and apply it to the pages where you need React. If you want it in all pages, you can contribute a ComponentClassTransformWorker2 to the service with the same name which applies the mixin to all pages. See MutableComponentModel.addMixinClassName(). -- Thiago