Hi Vincent,

On Fri, Apr 3, 2015 at 11:18 PM, [email protected] <[email protected]>
wrote:

> Hi Edy,
>
> I don’t enough about requirejs to make an educated answer on this part so
> my answer is only about the new proposed format.
>
> PROs:
> * possibly a bit better for end users
>
> CONs:
> * not restful (I think)
>

But isn't it much more restful than the current
http://localhost:8080/xwiki/bin/webjars/resources/path?value=<id>%2F<version>%2F<filePath>
?


> * we mix the resource name with the rest of the URL (semantic mixing)
>

IMO, the ID (if this is what you refer to as resource name) should always
be between 2 "/"es. If the resource name contains a "/" itself, then it
should be URL escaped by the caller.

If by resource name you mean the entire
"value=<id>%2F<version>%2F<filePath>" part, see below.


> * by mixing the resource name with the rest of the URL we need to reparse
> the URL to reconstruct the resource name
>
> Let me give more information by what I mean on these last 2 points. Right
> now when we have a URL our ExtendedURL class parses the URL by parsing the
> path portions and storing them into a List.
> So if we have http:////path1/path2/path3, we get [“path1”, “path2”,
> “path3]. If we wish to get the resource name we need to [“path1”, “path2”,
> “path3].join(“/“).
>
> In addition I also find it more logical that the resourcename be a BLOB
> for which we don’t know the structure (whether it’s separated by “/“ or “.”
> or anything else, we shouldn’t care about). The way we load the resource is
> by doing a ClassLoader.getResourceAsStream(resourceName). Said differently
> it’s by pure chance that we have both “/“ for loading a classloader
> resource and as a separator for a URL!
>
> So I don’t want to block your proposal but it’s seems we’re mixing apples
> and oranges and I’m not sure it’s a good thing.
>

I am having a hard time understanding if you are talking about URL
management in XWiki in general (i.e. determining what is the action that
the current URL is trying to reach; is it webjars, is it view, is it bin,
is it rest, etc...), or if you are talking about the actual webjar resource
that the client is trying to reach (i.e. files inside the webjar).

If you are talking about webjars in specific, don`t forget that they are
basically zipped directories and that will not really change AFAIK. Any
resource inside a webjar is basically a file in a directory. Webaps will
still want to handle them as files inside directories inside the web
application, not as parameters inside a URL request to some service that
returns files. This is actually where the problem comes when a library such
as requirejs uses and enforces this assumption.

Thanks,
Eduard


> I’m curious to know what others think.
>
> Thanks
> -Vincent
>
>
> On 3 Apr 2015 at 18:39:09, Eduard Moraru ([email protected](mailto:
> [email protected])) wrote:
>
> > Hi,
> >
> > Currently, the webjars URL mapping is the following:
> >
> > http://localhost:8080/xwiki/bin/webjars/resources/path?value=
> > %2F%2F
> >
> > Example:
> > $services.webjars.url('codemirror', 'lib/codemirror.js')
> > returns
> >
> http://localhost:8080/xwiki/bin/webjars/resources/path?value=codemirror%2F5.1/lib/codemirror.js
> >
> > The problem with this is that require modules that use relative paths for
> > their dependencies are broken because of the URL mapping we use, more
> > specifically by the "?" character inside the URL we use.
> >
> > A concrete example is the CodeMirror webjar that defines its own modules
> > which express their dependencies relatively: "../../lib/codemirror"
> >
> > Here we have a problem, since if we directly depend on
> > "$services.webjars.url('codemirror', 'mode/css/css.js')", the module will
> > fail to find its relatively defined dependency.
> >
> > One approach would be to define paths, so that requirejs can work its
> magic:
> >
> > require.config({
> > paths: {
> > cm : "
> >
> http://localhost:8080/xwiki/bin/webjars/resources/path?value=codemirror%2F5.1
> > "
> > }
> > });
> >
> > require(["cm/lib/codemirror", "cm/mode/css/css"], function (CodeMirror) {
> > console.log(CodeMirror);
> > });
> >
> > This properly finds "/lib/codemirror.js" and "mode/css/css.js" that we
> > explicitly request, however, the internal dependency of css.js fails to
> be
> > found at the resolved URL "
> >
> http://localhost:8080/xwiki/bin/webjars/resources/path?value=codemirror%2F5.1/lib/codemirror
> > ".
> >
> > Requirejs does not add the ".js" extension to the resolved path because
> the
> > resolved path contains a "?" character so it is considered an absolute
> URL,
> > not a relative path.
> >
> > The proposal is to stop using this URL mapping, since it is awkward to
> have
> > paths in parameters and, instead, use a more intuitive one that is both
> > good for clients and for requirejs.
> >
> > The proposed mapping/scheme is:
> >
> > http://localhost:8080/xwiki/bin/webjars///
> >
> > Any additional parameters that we might need for the webjars action would
> > be appended at the end. There is currently 1 case that I know of, which
> is
> > "evaluate=true|false".
> >
> > Without this change, I can not find any solution to using a webjar such
> as
> > CodeMirror that uses relative defined modules.
> >
> > Thanks,
> > Eduard
> >
> > P.S.: Any additional advice on using requirejs to circumvent this
> > limitation is most than welcomed.
>
> _______________________________________________
> devs mailing list
> [email protected]
> http://lists.xwiki.org/mailman/listinfo/devs
>
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to