From: | Surinder Kumar <surinder(dot)kumar(at)enterprisedb(dot)com> |
---|---|
To: | Sarah McAlear <smcalear(at)pivotal(dot)io> |
Cc: | Dave Page <dpage(at)pgadmin(dot)org>, George Gelashvili <ggelashvili(at)pivotal(dot)io>, pgadmin-hackers <pgadmin-hackers(at)postgresql(dot)org>, Matthew Kleiman <mkleiman(at)pivotal(dot)io> |
Subject: | Re: [pgAdmin4]: Webpacking of static JS/CSS |
Date: | 2017-07-17 09:48:32 |
Message-ID: | CAM5-9D__F8NOD=0BpV3sFtc0x+Yh07xkjs+o2B_kmfktqReFww@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgadmin-hackers |
Hi
I'm currently working on first TODO: "Automatically handle static and
template JS files"
As discussed with Ashesh, currently the paths to module id are written
manually in webpack.config.js, instead the path defined in moudle's `def
get_own_javascript()` should be used.
So, we will be generating a paths.json file which will contain:
1. resolve > alias - path with reference to module id.(Static files)
2. externals - list of modules to be loaded dynamically on demand(Template
files)
3. Shim module dependency
4. List of JS modules to be loaded in specified order.
*Implementation:*
To generate `paths.json` file, we will be using `Flask's test_client` to
make an http request internally within the app context so we can call
`current_app.javascripts` property and return the list of JS paths and
write those into paths.json file and then use it in webpack.shim.js before
the execution of `yarn run bundle` in `javascript_bundler.py`
*For example:*
@app.route('/get_script_paths')
def get_script_paths():
from flask import current_app
from pgadmin.utils.ajax import make_json_response
return make_json_response(data=current_app.javascripts)
if config.DEBUG:
with app.test_client() as client:
import simplejson as json
list_scripts = client.get('/get_script_paths')
scripts = json.loads(list_scripts.data)
javascriptBundler = JavascriptBundler()
javascriptBundler.bundle(scripts['data'])
This also needs little change in module dependency we defined using 'When':
'node_name' in `def get_own_javascripts(...)` method
the module specified(name: module_name) is loaded when module given in
`When` is expanded in node. Since we are using Webpack in which behaviour
to load module is little different.
Now in webpack we are using `imports-loader` to load specific modules. So
this is how it should work.
1. First load all modules which do not have dependency on any node like
'about', 'dashboard', 'server-group', 'server' etc.
2. Load module such as `Databases` node first before its child nodes are
loaded.
Similarly load `Schemas` node before its child nodes are loaded as they are
dependent on parent node.
Thanks,
Surinder
On Wed, Jul 5, 2017 at 8:22 PM, Sarah McAlear <smcalear(at)pivotal(dot)io> wrote:
> Hello,
>
>
>> *Things to discuss:*
>>
>> How to differentiate between a static and template JS
>>
>> .
>>
>
> What is the advantage of webpacking templated JS? It seems as though this
> creates a system in which the bundled dependencies have to refer back to
> the backend to load the templates.
>
Templated JS will not be part of generated bundle JS, they will load
externally( an extra request will be made to server For example:
translations.js)
>
> If there is a performance win in packing templated JS then looking at it
> makes sense. Otherwise it may make sense to put off until it is clear that
> the templated files should be dealt with by either de-templating them or
> bundling them where there is a clear reason.
>
Template JS cannot be bundled, so i extract the <Jinja> code from template
files and put into a separate file - ABC.js (also moved template files to
static directory) and then load ABC.js dynamically as dependency of other
modules.
>
> However, we're wondering about possible performance penalties with
> templating larger files (as opposed to templating on-demand.) Since jinja
> templates can execute arbitrary python, this could get time expensive and
> further slow things like initial page-load.
> Another concern is: what happens when a template gets out of date (e.g. if
> browser.js had previously filled in the content for 'panel_item.content'
> and had been cached, would it render a new version with the new values when
> needed? Or is it possible that we would get old content?)
>
That file will always gets new content when loaded dynamically, the
content is not cached.
>
>
>> *Taks remaining:*
>>
>> 1.
>> Fix local variables which are declared without using var, have to check
>> in each file
>> by
>> running eslint (For now, i will fix only errors which are giving error
>> in browser).
>>
>> 2.
>> Move non-template files from ’templates’ to ’static’ directory. List of
>> pending
>> modules is here:
>>
>> - Tools (mostly all modules - 9 modules)
>> - Browser nodes - 3 modules(resource group, roles, tablespace)
>> - About
>>
>>
>> Also can we move
>> '
>> dashboard, statistic
>> s
>> , preferences and help
>> '
>> modules inside misc to preserve modularity as pgAdmin is modular
>> ?
>>
>
> Is there anything from a organization stance you discussed in the previous
> email that needs to be done to make this usable and consistent?
>
No
>
>
> Thanks,
>
> George & Sarah
>
From | Date | Subject | |
---|---|---|---|
Next Message | Dave Page | 2017-07-17 09:51:31 | pgAdmin 4 commit: Fix handline of large file uploads and properly show |
Previous Message | Dave Page | 2017-07-17 09:46:33 | Re: [pgAdmin4][runtime][Patch]: Fix RM #2559 |