if you look at the Network view in Chrome's Web Inspector I think you'll find
it's trying to GET these:
/yourapp/modules.gz/dep/canvas.js
/yourapp/modules.gz/tool/util.js
/yourapp/modules.gz/tool/log.js
/yourapp/modules.gz/tool/guid.js
It's hoping to find them in META-INF/modules/ but they're not there. The
solution is to make it look like they're there by shimming them all! For
example:
public static void contributeModuleManager(
MappedConfiguration<String, Object> configuration,
@Path("/META-INF/assets/a-1.0.0/a.js") Resource a,
@Path("/META-INF/assets/a-1.0.0/dep/canvas.js") Resource
depCanvas,
@Path("/META-INF/assets/a-1.0.0/tool/util.js") Resource
toolUtil,
...)
configuration.add("a", new JavaScriptModuleConfiguration(a));
configuration.add("dep/canvas", new
JavaScriptModuleConfiguration(depCanvas));
configuration.add("tool/util", new
JavaScriptModuleConfiguration(toolUtil));
...
}
Cheers,
Geoff
On 24 Mar 2015, at 3:59 pm, Geoff Callender
<[email protected]> wrote:
> Very good question. It's trying to lazy load from the local context. So far
> I've managed to sidestep modules that do that. I'll have a look into it.
>
> On 23 Mar 2015, at 5:56 pm, Rural Hunter <[email protected]> wrote:
>
>> Hi Geoff,
>>
>> Thanks so much for the detailed guide. My module A is AMD-compliant and has
>> no css files. I tried your solution in AppModule. It did resolved the
>> problem for A.js itself. But the A.js depends on many files in it's sub
>> directories. I checke the source of A.js and it's like this:
>> require('./dep/excanvas');
>> var util = require('./tool/util');
>> var log = require('./tool/log');
>> var guid = require('./tool/guid');
>>
>> I got 404 for all the access to those dependencies. How to solve this?
>>
>>
>> 2015-03-23 10:56 GMT+08:00 Geoff Callender <
>> [email protected]>:
>>
>>> Let's say "a" and its associated files are in a folder called a-1.0.0. Try
>>> dropping the folder into META-INF/assets and shim it by contributing to
>>> ModuleManager:
>>>
>>> public static void contributeModuleManager(
>>> MappedConfiguration<String, Object> configuration,
>>> @Path("/META-INF/assets/a-1.0.0/a.js") Resource a,
>>> ...)
>>>
>>> configuration.add("a", new
>>> JavaScriptModuleConfiguration(a).dependsOn("whatever"));
>>> ...
>>> }
>>>
>>> Now you can refer to it as module "a". If a.js was already an
>>> AMD-compliant module, that's fine, RequireJS will figure handle it. If a.js
>>> already does *require("whatever")* then you can leave out the
>>> .dependsOn("whatever") shown above.
>>>
>>> If it has css files, you might like to put them in a JavaScriptStack so
>>> that their path is kept in one place.
>>>
>>> public class ASupportStack implements JavaScriptStack {
>>>
>>> private final AssetSource assetSource;
>>>
>>> public ASupportStack(final AssetSource assetSource) {
>>> this.assetSource = assetSource;
>>> }
>>>
>>> public String getInitialization() {
>>> return null;
>>> }
>>>
>>> public List<Asset> getJavaScriptLibraries() {
>>> List<Asset> ret = new ArrayList<>();
>>> return ret;
>>> }
>>>
>>> public List<StylesheetLink> getStylesheets() {
>>> List<StylesheetLink> ret = new ArrayList<>();
>>>
>>> ret.add(new StylesheetLink(assetSource
>>>
>>> .getClasspathAsset("/META-INF/assets/a-1.0.0/a.css")));
>>> ret.add(new StylesheetLink(assetSource
>>>
>>> .getClasspathAsset("/META-INF/assets/a-1.0.0/a.print.css"),
>>> new StylesheetOptions("print")));
>>>
>>> return ret;
>>> }
>>>
>>> public List<String> getStacks() {
>>> return Collections.emptyList();
>>> }
>>>
>>> @Override
>>> public List<String> getModules() {
>>> return Collections.emptyList();
>>> }
>>>
>>> }
>>>
>>> In AppModule:
>>>
>>> public static void
>>> contributeJavaScriptStackSource(MappedConfiguration<String,
>>> JavaScriptStack> configuration) {
>>> configuration.addInstance("ASupportStack",
>>> ASupportStack.class);
>>> }
>>>
>>> In each page or component that uses module "a", either @Import the
>>> stylesheets or @Import the JavaScriptStack. I wish there was a way that
>>> would import it for you every time refer to module "a" but I don't know of
>>> one.
>>>
>>> I hope this is helping.
>>>
>>> Geoff
>>>
>>> On 23 Mar 2015, at 1:06 pm, Rural Hunter <[email protected]> wrote:
>>>
>>>> I already did that. The problem is this: I have a 3rd party module A.
>>> Both
>>>> my own code and another 3rd party module B depend on it. The standard
>>>> location of module A should be at classpath:META-INF/modules/ but it
>>> brings
>>>> in a lot of js files and sub-folders and makes the module root path(
>>>> classpath:META-INF/modules) a bit messy. So I want to put module A at
>>>> classpath:META-INF/modules/A. How can I achieve it?
>>>>
>>>> 2015-03-22 18:39 GMT+08:00 Chris Poulsen <[email protected]>:
>>>>
>>>>> Drop the 3rd party module in the usual place for modules
>>>>> (classpath:META-INF/modules) and reference it.
>>>>>
>>>>> http://tapestry.apache.org/javascript-rewrite.html has some info on the
>>>>> infrastructure and the tapestry source code (setup of the core
>>>>> stack/bootstrap modules etc. are good inspiration as well),
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Sat, Mar 21, 2015 at 4:19 PM, Rural Hunter <[email protected]>
>>>>> wrote:
>>>>>
>>>>>> How to work out if I want to config the path of a third-party module
>>> if I
>>>>>> use js stack?
>>>>>>
>>>>>> 2015-03-20 17:07 GMT+08:00 Chris Poulsen <[email protected]>:
>>>>>>
>>>>>>> In a javascript stack?
>>>>>>>
>>>>>>> On Fri, Mar 20, 2015 at 4:05 AM, Rural Hunter <[email protected]>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> I'm testing tapestry 5.4. I'm wondering where to put the
>>>>>> requirejs.config
>>>>>>>> code for my own modules and third-party modules?
>>>>>>>>
>>>>>>>> ---------------------------------------------------------------------
>>>>>>>> To unsubscribe, e-mail: [email protected]
>>>>>>>> For additional commands, e-mail: [email protected]
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>
>>>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]