React can in theory be used in all pages (globally). It will be like a core 
library for me, like jquery, underscore, bootstrap, etc. In TypeScript I am 
using
"compilerOptions": {
    "module": "amd".

I have written a service:
@Override
public void appendToModulePath(JSONObject cfg) {
    javaScriptSupport.addModuleConfigurationCallback(configuration -> {
        if (!configuration.has("paths")) {
            configuration.put("paths", cfg);
        } else {
            configuration.getJSONObject("paths").putAll(cfg.toMap());
        }
        return configuration;
    });
}

I am now calling this in my global <html t:type="layout", and adding paths like 
“leaflet”:”leaflet-src” on pages with a map.

Setting requirejs.config.paths globally should not load anything until loaded 
by require.
E.g: JS from a transpiled TypeScript with React: define(["require", "exports", 
"react", "react-dom"], function (require, exports, React, ReactDOM) {

I can try the Mixin technique, but still think Tapestry should have a way of 
contribute requirejs.config.paths.  You have a nice way contribute 
requirejs.config.shim which maybe could be modified to also accept paths. To 
support modern JS frameworks I think setting requirejs.config.paths in a nice 
way globally should be implemented.

S-E

From: Thiago H de Paula Figueiredo [via Apache Tapestry Mailing List Archives] 
[mailto:ml+s1045711n5733722...@n5.nabble.com]
Sent: fredag 24. november 2017 17.02
To: Svein-Erik Løken <sv...@jacilla.no>
Subject: Re: Contribute requirejs.config.paths to ModuleManager

On Fri, Nov 24, 2017 at 11:13 AM, Svein-Erik Løken <[hidden 
email]</user/SendEmail.jtp?type=node&node=5733722&i=0>> 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

________________________________
If you reply to this email, your message will be added to the discussion below:
http://apache-tapestry-mailing-list-archives.1045711.n5.nabble.com/Contribute-requirejs-config-paths-to-ModuleManager-tp5733721p5733722.html
To unsubscribe from users@tapestry.apache.org<mailto:users@tapestry.apache.org> 
Mailing List Archives, click 
here<http://apache-tapestry-mailing-list-archives.1045711.n5.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=2375125&code=c3ZlaW5AamFjaWxsYS5ub3wyMzc1MTI1fC0xNTM4NzY2ODg4>.
NAML<http://apache-tapestry-mailing-list-archives.1045711.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>

Reply via email to