Theme And Mode Path Infer Issue With Ace.js And Angular
Solution 1:
I finally was able to make my code work. My setup is different.
The reason adding script
tag explicitly made my code work is because By default ace detcts the url for dynamic loading by finding the script node for ace.js. This doesn't work if ace.js is not loaded with a separate script tag, and in this case it is required to set url explicitely
(https://ace.c9.io/#nav=howto). As I am loading modes
and themes
without using script
, I had to use basePath
etc. (see answer further).
I build my Angular
application and the it is served from my Play
server. The angular
build is stored in Play
's /public/ui
folder. The requests should be in format /assets/ui/..
which gets mapped to /public/ui/...
due to a rule in Play routes file
GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)
When I ran the code, I got error.
Uncaught DOMException: Failed to execute 'importScripts' on 'WorkerGlobalScope': The script at 'http://localhost:9000/worker-javascript.js' failed to load.
at blob:http://localhost:9000/3df21e42-fecb-4026-8bd6-f2b0d1d0540a:1:1
Earlier, I also got error `Unable to infer path to ace from script src, use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes or with webpack use ace/webpack-resolver`
It seems ng-ace-editor
imports .js
scripts (theme, mode, worker) based on the theme and mode of the editor. The theme and mode .js
files can be included in scripts.js
but some worker-.js
files can't be (I don't know why, maybe because worker ones are loaded dynamically using importScript
).
The scripts section in Angular.json
is (this will all get bundled in scripts.js
in Angular's final bundle)
"scripts": [
"./node_modules/ace-builds/src/ace.js",
"./node_modules/ace-builds/src/theme-eclipse.js",
"./node_modules/ace-builds/src/theme-monokai.js",
"./node_modules/ace-builds/src/mode-html.js"
]]
To include worker-.js
files, I added this rule because it seems angular-cli
can't load from node_modules
. So I had to copy the files from node modules to root of my ui
build - How to include assets from node_modules in angular cli project
"assets": [
"src/assets",
"src/favicon.ico",
{
"glob": "**/*",
"input": "./node_modules/ace-builds/src/",
"output": "/"
}
],
When I executed the code, I found error that http://localhost:9000/worker-javascript.js can't be loaded
. I realised that my files are loaded in /assets/ui/
path and not in the server's root directory. So I set ace.js
's basepath
to /assets/ui
in the component's .ts
file
import * as ace from 'ace-builds/src-noconflict/ace';
ace.config.set('basePath', '/assets/ui/');
ace.config.set('modePath', '');
ace.config.set('themePath', '');
In summary basePath
seem to be what is used to load scripts dynamically (eg worker scripts). modePath
and themePath
are /
as the mode and theme scripts are bundled in scripts.js
and my index.html
correctly loaded scripts.js
using <script>
tag and are available at root level need to copy worker-.js files outside node_modules as angular_cli can't copy assets from node_modules
Post a Comment for "Theme And Mode Path Infer Issue With Ace.js And Angular"