Thanks for the reply! Followup thoughts on some of your points below: - I like the simplicity of what you are proposing. Using the XBlock > runtime's pre-existing loader makes a great deal of sense for the reasons > you laid out.
...hat-tip to Peter Pinch for that idea ;-) - I think some of your use cases would be better handled through XBlock > dependencies. For example, IMO a complex feature like code syntax > highlighting should be associated with a particular XBlock, rather than > being added to an Advanced HTML block. Having the assets tied to the course > means that even if the block in question is removed, the assets would still > be loaded. It would be better to have them requested on-demand by only the > blocks that need them. Having said that, we don't have a mechanism in > XBlock to allow multiple blocks to share the same library. Yeah, I see what you're saying - there's definitely a risk of vestigial libraries being loaded with this approach (or libraries just being loaded earlier than needed). On the other hand, XBlocks also don't seem to me like a great fit for syntax highlighting or similar use cases... some specific concerns: 1. Developing new XBlocks requires enough know-how than it's likely out of reach for course authors (compared to, e.g., dropping in the script/CSS files for PrismJS <http://prismjs.com/#basic-usage> to add syntax highlighting course-wide) 2. XBlocks have to be accepted/installed into the platform before being used [I think?], while scripts/CSS resources can be added immediately by course authors 3. XBlocks can't currently be nested inside <problem> or <html> modules, so they're not great for things that might appear interspersed with text like code examples or graphs - There are performance implications to loading a number of individual > files like this. Having said that, it would be difficult to have individual > courses contribute files to the static asset pipeline, since courses can be > created/imported after the LMS has been stood up. > Agreed, though hopefully this will be less of an issue when HTTP/2 takes over sometime in the not-too-distant future =) The fact that static assets are cached should help in the meantime... it looks like edX sets the Cache-Control max-age to 1 year, and external JavaScript CDNs probably have fairly efficient caching behavior too. Let me know where I should go from here. Thanks! Martin On Monday, August 15, 2016 at 11:13:33 AM UTC-4, Andy Armstrong wrote: > > Hi Martin, > > Thanks for this. The use cases you describe are important, so it would be > great to talk through how it can be addressed. I'm not sure if this should > be handled as an OEP or not, so I posed that question in our OEP Slack > channel (https://openedx.slack.com/messages/open-edx-proposals/). > > I have a few thoughts to add to your initial proposal: > - I like the simplicity of what you are proposing. Using the XBlock > runtime's pre-existing loader makes a great deal of sense for the reasons > you laid out. > > - I think some of your use cases would be better handled through XBlock > dependencies. For example, IMO a complex feature like code syntax > highlighting should be associated with a particular XBlock, rather than > being added to an Advanced HTML block. Having the assets tied to the course > means that even if the block in question is removed, the assets would still > be loaded. It would be better to have them requested on-demand by only the > blocks that need them. Having said that, we don't have a mechanism in > XBlock to allow multiple blocks to share the same library. > > - I'd like to consider how such a mechanism should interact with > AMD-style loading. We have had some preliminary experimentation with > combining XBlocks with RequireJS, and I think it is important to take that > into account. > > - There are performance implications to loading a number of individual > files like this. Having said that, it would be difficult to have individual > courses contribute files to the static asset pipeline, since courses can be > created/imported after the LMS has been stood up. > > - We might want to make this feature be something that can be disabled if > a given installation is not comfortable with giving this power to its > authors. As you point out, the power is already there through multiple > other mechanisms, so maybe this isn't a concern. > > Thanks, > > - Andy > > On Fri, Aug 12, 2016 at 1:39 PM, Martin Segado <martin...@gmail.com > <javascript:>> wrote: > >> Hi all, >> >> Please let me know if this is a good fit for an OEP and I'll put one >> together. Also let me know if you would also find such a feature useful! >> >> *Issue:* I and others would benefit from a way to load course-wide >> JavaScript and CSS assets. There are numerous use cases for this: >> >> - Logging custom events (this alone make the platform even more >> valuable for conducting research) >> - Consistently styling course content (e.g., by creating classes for >> things like callout boxes or image alignment) >> - Loading useful JS libraries for things like graphing or code syntax >> highlighting >> - Trying experimental features (e.g., a course-material search bar; >> again, complete with event logging for research) >> >> *Existing workaround:* It's possible to do this in today's platform, but >> it requires adding <script> or <style> tags *to every single vertical of >> a course*. Clearly this is suboptimal; it increases deployment effort >> (especially when conducting multi-course experiments) and may needlessly >> increase network traffic. >> >> *Proposed solution: *Add a new policy key (name TBD) for course-wide >> assets: >> { >> "web_assets": [ >> "/static/mystyles.css", >> "/static/experiment.js", >> "//somecdn.com/library.js" >> ] >> } >> >> *Proposed implementation:* The courseware template already receives and >> renders an XBlock fragment (which includes JS and CSS resources); >> additional resources could simply be added to this fragment when the >> courseware context is created >> <https://github.com/edx/edx-platform/blob/add4d3bce3bd5a9a1a5ce4f3cbf9d416c6eb1ee2/lms/djangoapps/courseware/views/index.py#L373-L437>. >> >> This approach leverages the existing XBlock/Django infrastructure to handle >> de-duping and rendering, so I expect little code would be needed for the >> actual implementation. >> >> *Possible concerns & mitigation strategies:* >> >> - Security. Again, though, the ability to include arbitrary >> JavaScript in a course *already exists*... this feature just provides >> a more elegant way to do so course-wide. It is possible that making >> it easier would lead to wider script usage and thus increase the odds of >> users creating a vulnerability; this could be mitigated by (1) adding a >> stern warning to the policy key description about including scripts only >> from trusted origins, or (2) limiting this feature to /static/* files if >> it's a really big concern. >> >> - Support. Platform hosts such as edX should make it clear that this >> is a power-user feature that would carry *no support* beyond that for >> current <script> and <style> tags (i.e., the platform guarantees that >> your >> scripts will make it into the page, but you're on your own if they don't >> work or if something breaks due to platform changes). As with security >> above, it's possible there will be more complaints/support requests from >> users simply because of wider script/CSS usage, though good documentation >> and a warning in the policy key description should hopefully keep these >> to >> a minimum. >> >> ...Thoughts? >> Martin (MITx graduate research fellow) >> >> -- >> You received this message because you are subscribed to the Google Groups >> "General Open edX discussion" group. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/edx-code/bbab60d8-eeee-4a4c-935d-75715b7ec33a%40googlegroups.com >> >> <https://groups.google.com/d/msgid/edx-code/bbab60d8-eeee-4a4c-935d-75715b7ec33a%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > > > > -- > > *Andy Armstrong* > > edX | UI Architect | an...@edx.org <javascript:> > > 141 Portland Street, 9th floor > > Cambridge, MA 02139 > http://www.edx.org <http://www.edxonline.org/> > > [image: > http://www.e-learn.nl/media/blogs/e-learn/edX_Logo_Col_RGB_FINAL.jpg?mtime=1336074566] > -- You received this message because you are subscribed to the Google Groups "General Open edX discussion" group. To view this discussion on the web visit https://groups.google.com/d/msgid/edx-code/24c480ae-231b-4285-a7d6-dd0f37bf855e%40googlegroups.com.