I tried to fight it too, but had to capitulate. 

After some debugging my @Contribute(JavaScriptStackSource.class) was not set:

public class ModuleManagerImpl implements ModuleManager
{
private Resource resolveModuleNameToResource(String moduleName)
    {
        Resource resource = shimModuleNameToResource.get(moduleName);

        if (resource != null)
        {
            return resource;
        }

        // Tack on a fake extension; otherwise modules whose name includes a 
'.' get mangled
        // by Resource.withExtension().
        String baseName = String.format("/META-INF/modules/%s.EXT", moduleName);

        Resource baseResource = classpathRoot.forFile(baseName);

        for (String extension : extensions)
        {
            resource = baseResource.withExtension(extension);

            if (resource.exists())
            {
                return resource;
            }
        }

        // Return placeholder for null:
        return classpathRoot;
    }

My module is not listed in shimModuleNameToResource, and does not exist in 
/META-INF/modules/%s.EXT. The result is an empty classpathRoot.


I think I don't fully understand JavaScriptStack. I think a method is missing: 
Map<String, JavaScriptModuleConfiguration> getJavaScriptModules(). I would like 
to have a example of how to include a AMD/UMD module. What about support for 
CommonJS?




In the debugging process I found that @Contribute(ModuleManager.class) was the 
perfect choice for me.

    @Contribute(ModuleManager.class)
    public static void setupMyBaseModules(MappedConfiguration<String, Object> 
configuration, @Symbol(SymbolConstants.PRODUCTION_MODE) boolean productionMode) 
{
        String[] reactModules = {"react", "react-dom"};
        String ext = productionMode ? ".min.js" : ".js";
        for (String m : reactModules) {
            configuration.add(m, new JavaScriptModuleConfiguration(new 
ClasspathResource(String.format("META-INF/assets/js/%s%s", m, ext))));
        }
    }

I think I was fooled by:

The documentation for ModuleManager.class say:
"...This is primarily used to wrap non-AMD compliant libraries for use with 
RequireJS"

The internal variable Map<String, Resource> shimModuleNameToResource in 
ModuleManagerImpl. The shim prefix...

S-E




From: Chris Poulsen [via Apache Tapestry Mailing List Archives] 
[mailto:ml+s1045711n5733731...@n5.nabble.com] 
Sent: tirsdag 28. november 2017 08:34
To: Svein-Erik Løken <sv...@jacilla.no>
Subject: Re: Contribute requirejs.config.paths to ModuleManager

Hi, 

It has been a while since I last fought the module system, but in some 
cases I've used a request filter to map between module and asset paths 
(triggering on known module paths and then returning permanent redirects to 
the actual asset urls in the filter) - This was necessary in order to get 
stuff like CK editor to load properly as a module and still allowing it to 
dynamically require its plugins IIRC. 

-- 
Chris 




---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to