Re: [pgAdmin4]: Webpacking of static JS/CSS

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
>

In response to

Responses

Browse pgadmin-hackers by date

  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