-
Notifications
You must be signed in to change notification settings - Fork 12k
How to work with web workers (use a web worker IN cli project) #5885
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Check out https://stackoverflow.com/questions/43276044/angular-cli-generated-app-with-web-workers Would be really great to get this support by default! |
Thanks a lot for the reply! I had seen that answer on Stackoverflow, but unfortunately they are trying to actually run their whole Angular app IN a web worker. I am trying to use an existing web worker in my app, so it's a little different. I appreciate the help though. Hopefully someone else can chime in here. |
There's an opened issue here too : #2305 |
@maxime1992 I appreciate your reply. That's a similar, but different issue. It's related to the Stackoverflow question that @bmayen linked to as well. Both of those deal with trying to run an entire Angular app IN a web worker, while I just want to use and run an existing web worker in my app. |
@jbgarr, just curious, why do you want to take this approach? The Angular team has done some amazing work supporting running the entire app in a worker. You might meet with less friction if your use case could allow for that approach instead. |
We were using an inline worker-loader, but now it does not work for us (see #4773). So now we are using file-loader. |
@bmayen I have a section of my app that is potential performance bottleneck so I built a custom web worker to handle the heavy lifting on another thread, but I don't necessarily need/want to run my whole app in a worker. I built the original web worker for my app before converting over to the Angular CLI to build/bundle my app and I was hoping I could just use it as is without custom tailoring my build process. @shlangus I had seen issue #4773 and was a bit disappointed. With your new approach are you having to use |
@jbgarr First of all you need to configure build process for your worker. To do that you can create a separate webpack config such as following. It uses ts-loader so you should install it too.
Now you are able to run Once you have done it you need to get ability to include your worker into your angular app.
This solution doesn't require to perform an ejecting but it also doesn't watch for changes in the worker. |
@shlangus Thanks a lot for the explanation! I'll have to give that a try when I've got some time. The general idea makes sense. Thanks again, I appreciate it. |
Heya, I added some information on how to currently use webworkers in #2305. I know there's been some conversation here but that's the original issue, and it's better to concentrate discussion in a single one. |
@filipesilva Thanks for the info and I had seen that issue already, but I think there is a core difference between what I'm asking/trying to do VS what that issue touches on. I am trying to use an existing web worker IN my Angular app, while that issue focuses on running an entire Angular app IN a web worker. I believe these are similar, but very different issues. Can you consider reopening this? |
@filipesilva in the other issue you talked about service-worker and not web-worker : Unless it's a typo, maybe you might reopen this (+cc @jbgarr comment) |
@jbgarr @maxime1992 you're absolutely right, reopening. |
@filipesilva can the steps mentioned in this post be integrated in cli? https://medium.com/@enriqueoriol/angular-with-web-workers-step-by-step-dc11d5872135 Repo: https://github.com/kaikcreator/angular-cli-web-worker |
@naveedahmed1 Hm... I don't think we can do it in a seamless way, no. It would require app level switches to control the build behaviour. What could perhaps be done in the interim is provide I can also say we're looking at supporting different platforms in the future (e.g. |
@filipesilva glad to know about support for other platforms in future versions. Meanwhile, what if the changes in app.module.ts and main.ts are left for the user while the cli:
So, that if a user wants to add support for webworker, they just make changes to app.module.ts and main.ts and specify platform as webworker in build command. Would it be possible? |
@naveedahmed1 it would be possible, but it's not a very good idea from the CLI standpoint. It's better to properly provide platform support and a proper API for it, than just trying to get it to work ASAP. For the moment, the eject based guide seems to be the best option. |
There are two issues being discussed in this thread. OP is asking about having individual webworkers from the context of an app running on the UI thread. Others are discussing what is being requested in #2305 , which is what the eject-based option attempts to solve. @filipesilva, in general, I think the #2305 approach is most beneficial to the community as this is the official Angular way. Any chance we could get a prioritization of this feature or an idea of the timeline? Would be very helpful for planning when we can fully integrate CLI into our workflow... which we're desperate to do ASAP :) |
@bmayen I don't have a timeline for it, no. It's something to be considered after |
@bmayen for individual web workers there is a plugin which can be used https://github.com/haochi/angular2-web-worker |
Thanks @naveedahmed1. May still be of interest to the OP. I'm actually more concerned with #2305, personally. Going to hop out of this thread in favor of that one. |
@naveedahmed1 Thanks for the plugin link. I'll definitely take a look. |
Let me know if https://github.com/haochi/angular2-web-worker addresses your needs. The |
@filipesilva should the eject based approach work with Lazyloading? |
This is my workaround. Step 1. Add a custom webpack build to Angular CLISince Angular 6 you can use the Angular CLI for custom webpack builds. Add to
Create a simple webpack config, which builds the worker script to your dist directory, e.g.: const path = require('path');
const config = {
entry: './src/your-worker.js',
mode: 'production',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'your-worker.js'
}
};
module.exports = config; Step 2. include the generated worker script in your Angular appIn "scripts": [
{ "input": "dist/your-worker.js", "lazy": true }
] Step 3: make sure to build your worker script first...Just run: And/or modify your package.json to run before
Step 4: profit!export class AppComponent {
ngOnInit(): void {
const worker = new Worker('your-worker.js');
}
} |
I will double check this, but I think that by using Webpack loaders, you'll be fine using Typescript files for the source of the worker. |
@michaeljota I did't try that yet. But I guess then you also need to include a typescript loader, as you have a custom webpack config. I didn't want to maintain a huge webpack config. ;) |
@dirkluijk That is a great solution and something I will use. As an experiment, I wonder how other new Angular 6 CLI features may enhance the architecture -- such as generating the worker code as another app or lib? That may over-engineer this solution for your app. It's just a thought for larger apps. |
@dirkluijk Thank you for your example. I do not see why the scripts array inside I have Typescript source, and while it does work, the compiler complains about This is from my project https://github.com/sladiri/web-worker-angular-v7
|
There is actually a package for this: https://www.npmjs.com/package/ngx-web-worker I've tried it and it works as far as I can tell. |
@dirkluijk great and quick solution 👏👏👏 I am wondering if you tried with |
I have tried implementing a version of the solution given by @jerryorta-dev into an Angular 6 library. I used the That approach just wouldn't work. Finally I found this: #5885 (comment). Angular Libraries are packaged using ngpackgr which does not use Webpack and hence there is no support for loaders. What's more, they also discuss the possibility of Angular CLI moving away from Webpack completely. That means that there would be no supported means to deploy standalone web-workers in Angular CLI. All discussion tends to point to the fact that the entire Angular Application can be run in a web-worker. However, that approach wouldn't work if we need to use some libraries (example: D3) which need access to the DOM. |
@kiranjholla What that comments points out is that actually Angular CLI has moved from a building system in the past (From SystemJS to Webpack) and the CLI is all about abstract the build job in a way that the developer can have a consisten behavior. The solution @dirkluijk post in his comment should work, as long as Angular implement Webpack. However, I really doubt that they are moving to another building system any time soon. Even if they did, as this is now, I'm sure this would still work, as you are just using another builder task. |
Exactly. When Angular will replace webpack for another tool, the CLI will still support it by builders like |
@michaeljota @dirkluijk That's a fair point. Maybe I misinterpreted the comment and jumped the gun. However, I like the solution that uses Are you aware of any automated way that I could include a output hash in the worker.js file while importing it using the Thanks. |
I already asked this question few comments above... #5885 (comment) Also tried on StackOverflow and angular/cli but without luck.
In case you find a solution don't hesitate to give feedback here |
@kiranjholla @mboughaba Have you tried #5885 (comment)? |
I spoke too fast 😞 ... This was loading the |
You might be interested in using inline web workers to avoid the overhead of having to create a separate Webpack configuration with Typescript etc.: |
It could be great to create a clean repository with a full working example of an Angular 7 app with Lazy-Loading, running entirely in a web-worker. |
@mhosman This issue is about using web workers IN an Angular app. Not running Angular itself in a worker. For the latter, see https://legacy-to-the-edge.com/2018/05/01/platform-webworker-in-angular/ (I just googled for it) |
Thanks @dirkluijk, my problem is that when I'm loading modules, loaders and the UI itself is stucked for a couple of seconds. I need a way to run the logic in the background in order to get the animations only working in the main thread. |
There's ongoing work to add https://github.com/googlechromelabs/worker-plugin in #12575. |
One of the problems is when you load modules and material2 animations get stuck. |
This issue has been automatically locked due to inactivity. Read more about our automatic conversation locking policy. This action has been performed automatically by a bot. |
Bug Report or Feature Request (mark with an
x
)Versions.
@angular/cli: 1.0.0
node: 6.9.1
os: darwin x64 (macOS Sierra 10.12.3)
Is there a way to import and use a web worker in a component using angular-cli? I'm trying to incorporate a web worker that I wrote into my project, but I'm not having any luck. The web worker worked fine in my project before attempting to convert it to use the CLI (previous version was based on System.js). I'm trying to import my web worker code like this:
and then I'm trying to create my actual worker instance like this:
The above does not work though, and if I log MyWorker right after I try to import it I see it's just an empty object instead of a function (which is what it is in my other app). Any help on this would be much appreciated!
UPDATE
I just want to clarify what I'm trying to do: I want to use an existing web worker IN my Angular app, not run my whole app IN a web worker. I know there is separate issue already that relates to the trying to run an entire app in a web worker. These are similar, but very different issues.
The text was updated successfully, but these errors were encountered: