Hello! I am not sure if you are still have this problem, but… I’ve found another solution 
This is my solution for v15.
So, I use Portal Pages (see Portal Pages ) for my app and I have custom base Jinja2 template and have got the same issue.
My solution: add this in your Jinja2 template into the bottom of body container.
<!-- somewhere at the bottom of <body> container... -->
<!-- js should be loaded in body! -->
<script type="text/javascript" src="/assets/frappe/js/lib/jquery/jquery.min.js"></script>
{{ include_script('frappe-web.bundle.js') }}
{{ include_script('dialog.bundle.js') }}
{{ include_script('controls.bundle.js') }}
{{ include_script('bootstrap-4-web.bundle.js') }}
Notice that I use *.bundle.js instead of *.min.js!
You will still have a problem with CSS styles (if you use custom base template as me), but I think you know how to deal with it 
So, this is a code sample from my template.
<!-- somewhere at the bottom of <body> container... -->
{% block base_scripts %}
<!-- js should be loaded in body! -->
<script type="text/javascript" src="/assets/frappe/js/lib/jquery/jquery.min.js"></script>
<script>
frappe.boot = {{ boot | json }}
// for backward compatibility of some libs
frappe.sys_defaults = frappe.boot.sysdefaults;
</script>
{{ include_script('frappe-web.bundle.js') }}
{{ include_script('dialog.bundle.js') }}
{{ include_script('controls.bundle.js') }}
{{ include_script('bootstrap-4-web.bundle.js') }}
{% endblock %}
And in my case it transforms in
<!-- somewhere at the bottom of <body> container... -->
<!-- DO NOT COPYPASTE! IT WON'T HELP YOU! LOOK EXAMPLE ABOVE. -->
<!-- DO NOT COPYPASTE! IT WON'T HELP YOU! LOOK EXAMPLE ABOVE. -->
<!-- DO NOT COPYPASTE! IT WON'T HELP YOU! LOOK EXAMPLE ABOVE. -->
<!-- js should be loaded in body! -->
<script type="text/javascript" src="/assets/frappe/js/lib/jquery/jquery.min.js"></script>
<script>
frappe.boot = {
"apps_data": {
"apps": [
{
"logo": "shhhh.... it's my secret",
"name": "shhhh.... it's my secret",
"route": "shhhh.... it's my secret",
"title": "shhhh.... it's my secret"
}
],
"default_path": "shhhh.... it's my secret",
"is_desk_apps": 1
},
"assets_json": {
"bank-reconciliation-tool.bundle.js": "/assets/erpnext/dist/js/bank-reconciliation-tool.bundle.PQSY2TRN.js",
"billing.bundle.js": "/assets/frappe/dist/js/billing.bundle.CPRCUCBA.js",
"bom_configurator.bundle.js": "/assets/erpnext/dist/js/bom_configurator.bundle.VB3HBFNX.js",
"bootstrap-4-web.bundle.js": "/assets/frappe/dist/js/bootstrap-4-web.bundle.AZ67VXZX.js",
"build_events.bundle.js": "/assets/frappe/dist/js/build_events.bundle.HJHYQDCL.js",
"controls.bundle.js": "/assets/frappe/dist/js/controls.bundle.2XKRTN7I.js",
"data_import_tools.bundle.js": "/assets/frappe/dist/js/data_import_tools.bundle.FXJ6JQBT.js",
"desk.bundle.css": "/assets/frappe/dist/css/desk.bundle.SQWHLJTZ.css",
"desk.bundle.js": "/assets/frappe/dist/js/desk.bundle.OT3DGGLF.js",
"dialog.bundle.js": "/assets/frappe/dist/js/dialog.bundle.IGI4JRN4.js",
"email.bundle.css": "/assets/frappe/dist/css/email.bundle.V4P6ZDB4.css",
"erpnext-web.bundle.css": "/assets/erpnext/dist/css/erpnext-web.bundle.YGMY5XAQ.css",
"erpnext-web.bundle.js": "/assets/erpnext/dist/js/erpnext-web.bundle.J4A2DQB4.js",
"erpnext.bundle.css": "/assets/erpnext/dist/css/erpnext.bundle.DIRY76RF.css",
"erpnext.bundle.js": "/assets/erpnext/dist/js/erpnext.bundle.FBKLI3BW.js",
"erpnext_email.bundle.css": "/assets/erpnext/dist/css/erpnext_email.bundle.NV7QPSMU.css",
"file_uploader.bundle.js": "/assets/frappe/dist/js/file_uploader.bundle.IZ3HCER6.js",
"form.bundle.js": "/assets/frappe/dist/js/form.bundle.RZ7JD6ST.js",
"form_builder.bundle.js": "/assets/frappe/dist/js/form_builder.bundle.GXZ2NPDV.js",
"frappe-web.bundle.js": "/assets/frappe/dist/js/frappe-web.bundle.X77XLJGO.js",
"hierarchy-chart.bundle.js": "/assets/hrms/dist/js/hierarchy-chart.bundle.23WPLVL4.js",
"hrms.bundle.css": "/assets/hrms/dist/css/hrms.bundle.C2E2YTVH.css",
"hrms.bundle.js": "/assets/hrms/dist/js/hrms.bundle.UFYK6FJM.js",
"interview.bundle.js": "/assets/hrms/dist/js/interview.bundle.N5G7FWNY.js",
"item-dashboard.bundle.js": "/assets/erpnext/dist/js/item-dashboard.bundle.VE5OVFWT.js",
"kanban_board.bundle.js": "/assets/frappe/dist/js/kanban_board.bundle.OUFA2R27.js",
"libs.bundle.js": "/assets/frappe/dist/js/libs.bundle.LLRFRX7M.js",
"list.bundle.js": "/assets/frappe/dist/js/list.bundle.CMWN66J7.js",
"login.bundle.css": "/assets/frappe/dist/css/login.bundle.UT4OGTGZ.css",
"logtypes.bundle.js": "/assets/frappe/dist/js/logtypes.bundle.MJKW7EK3.js",
"onboarding_tours.bundle.js": "/assets/frappe/dist/js/onboarding_tours.bundle.P7QYMXLW.js",
"pdfjs.bundle.css": "/assets/print_designer/dist/css/pdfjs.bundle.NMMNFR4I.css",
"performance.bundle.js": "/assets/hrms/dist/js/performance.bundle.SCUNUCJR.js",
"point-of-sale.bundle.js": "/assets/erpnext/dist/js/point-of-sale.bundle.JTJY4AB2.js",
"print.bundle.css": "/assets/frappe/dist/css/print.bundle.OTHU7GDU.css",
"print_designer.bundle.css": "/assets/print_designer/dist/css/print_designer.bundle.RFHKTDEN.css",
"print_designer.bundle.js": "/assets/print_designer/dist/js/print_designer.bundle.V2LLU4WK.js",
"print_format.bundle.css": "/assets/frappe/dist/css/print_format.bundle.ORPUVUUZ.css",
"print_format_builder.bundle.js": "/assets/frappe/dist/js/print_format_builder.bundle.4FCO26LT.js",
"report.bundle.css": "/assets/frappe/dist/css/report.bundle.EFJTV7KG.css",
"report.bundle.js": "/assets/frappe/dist/js/report.bundle.7DC7UBSV.js",
"rtl_desk.bundle.css": "/assets/frappe/dist/css-rtl/desk.bundle.VOVAOSUK.css",
"rtl_email.bundle.css": "/assets/frappe/dist/css-rtl/email.bundle.X23KCJZV.css",
"rtl_erpnext-web.bundle.css": "/assets/erpnext/dist/css-rtl/erpnext-web.bundle.NQ3SD4FZ.css",
"rtl_erpnext.bundle.css": "/assets/erpnext/dist/css-rtl/erpnext.bundle.AEIHBNLC.css",
"rtl_erpnext_email.bundle.css": "/assets/erpnext/dist/css-rtl/erpnext_email.bundle.3BXZTKFI.css",
"rtl_hrms.bundle.css": "/assets/hrms/dist/css-rtl/hrms.bundle.BTV7FLUW.css",
"rtl_login.bundle.css": "/assets/frappe/dist/css-rtl/login.bundle.YJEVXPVK.css",
"rtl_pdfjs.bundle.css": "/assets/print_designer/dist/css-rtl/pdfjs.bundle.YIFM5XM5.css",
"rtl_print.bundle.css": "/assets/frappe/dist/css-rtl/print.bundle.ILE3B7QU.css",
"rtl_print_designer.bundle.css": "/assets/print_designer/dist/css-rtl/print_designer.bundle.HYD5KP4J.css",
"rtl_print_format.bundle.css": "/assets/frappe/dist/css-rtl/print_format.bundle.IYN5VNXE.css",
"rtl_report.bundle.css": "/assets/frappe/dist/css-rtl/report.bundle.GTETNPK7.css",
"rtl_web_form.bundle.css": "/assets/frappe/dist/css-rtl/web_form.bundle.MRVGC3BZ.css",
"rtl_website.bundle.css": "/assets/frappe/dist/css-rtl/website.bundle.IV3DTM2T.css",
"sentry.bundle.js": "/assets/frappe/dist/js/sentry.bundle.SI3DB3BY.js",
"telemetry.bundle.js": "/assets/frappe/dist/js/telemetry.bundle.ZJBT5ETW.js",
"user_profile_controller.bundle.js": "/assets/frappe/dist/js/user_profile_controller.bundle.TAMQL3L3.js",
"video_player.bundle.js": "/assets/frappe/dist/js/video_player.bundle.IOEIXC2G.js",
"web_form.bundle.css": "/assets/frappe/dist/css/web_form.bundle.G247U4LD.css",
"web_form.bundle.js": "/assets/frappe/dist/js/web_form.bundle.LUJVTFJD.js",
"website.bundle.css": "/assets/frappe/dist/css/website.bundle.MKXVRUAB.css",
"workflow_builder.bundle.js": "/assets/frappe/dist/js/workflow_builder.bundle.PUPGOUPE.js"
},
"is_fc_site": 0,
"lang": "shhhh.... it's my secret",
"sitename": "shhhh.... it's my secret",
"sysdefaults": {
"currency": "shhhh.... it's my secret",
"date_format": "shhhh.... it's my secret",
"first_day_of_the_week": "shhhh.... it's my secret",
"float_precision": shhhh.... it's my secret,
"number_format": "shhhh.... it's my secret",
"time_format": "shhhh.... it's my secret"
},
"time_zone": {
"system": "shhhh.... it's my secret",
"user": "shhhh.... it's my secret"
}
}
// for backward compatibility of some libs
frappe.sys_defaults = frappe.boot.sysdefaults;
</script>
<script type="text/javascript" src="/assets/frappe/dist/js/frappe-web.bundle.X77XLJGO.js"></script>
<script type="text/javascript" src="/assets/frappe/dist/js/dialog.bundle.IGI4JRN4.js"></script>
<script type="text/javascript" src="/assets/frappe/dist/js/controls.bundle.2XKRTN7I.js"></script>
<script type="text/javascript" src="/assets/frappe/dist/js/bootstrap-4-web.bundle.AZ67VXZX.js"></script>
<script type="text/javascript" src="/website_script.js"></script>
It you are not using Jinja2, you can check your /assets/frappe/dist/js/* sources at the DevTools → Sources, but I am not sure if their files’ names persists over multiple sites.