iotron Posted January 21, 2023 Share Posted January 21, 2023 I have been able to successfully implement gsap in a nuxt 3 plugin with the following steps. Create a gsap.client.js in plugins folder. import { gsap } from 'gsap' import { ScrollTrigger } from 'gsap/ScrollTrigger' import { ScrollToPlugin } from 'gsap/ScrollToPlugin' import { Draggable } from 'gsap/Draggable' export default defineNuxtPlugin((nuxtApp) => { if (process.client) { gsap.registerPlugin(ScrollTrigger, ScrollToPlugin, Draggable) } return { provide: { gsap, Draggable, ScrollTrigger, }, } }) and in your app.vue or any vue component. const { $gsap: gsap, $Draggable: Draggable } = useNuxtApp(); I have been directly using the gsap object instead of using gsap.context. Is these the correct and optimal way to use gsap with nuxt3? 1 Link to comment Share on other sites More sharing options...
Cassie Posted January 21, 2023 Share Posted January 21, 2023 Hi there! Context is really helpful for cleanup. You can use GSAP without it but you'll have to manually cleanup animations if you remove components Here's some demos that may help you - https://stackblitz.com/@GreenSockLearning/collections/gsap-nuxtjs-starters 1 Link to comment Share on other sites More sharing options...
miguelst Posted January 22, 2023 Share Posted January 22, 2023 13 hours ago, Cassie said: Hi there! Context is really helpful for cleanup. You can use GSAP without it but you'll have to manually cleanup animations if you remove components Here's some demos that may help you - https://stackblitz.com/@GreenSockLearning/collections/gsap-nuxtjs-starters How do you mean "remove components", for general purposes is using the plugin method okay? Link to comment Share on other sites More sharing options...
iotron Posted January 22, 2023 Author Share Posted January 22, 2023 18 hours ago, Cassie said: Hi there! Context is really helpful for cleanup. You can use GSAP without it but you'll have to manually cleanup animations if you remove components Here's some demos that may help you - https://stackblitz.com/@GreenSockLearning/collections/gsap-nuxtjs-starters Thank you so much for the examples. I am migrating my project from Nuxt 2 to Nuxt 3, and most of my animations are using the gsap object directly for creating reveal, text, and svg animations. Rewriting the object usage animations to context usage would take extra workload, that's why I took the plugins way to import the gsap/plugin objects and rest of the code works the same. I am not usually removing any components, only adding them incrementally through animations. My objective is to build the app with optimal performance and build size. 1 Link to comment Share on other sites More sharing options...
Cassie Posted January 22, 2023 Share Posted January 22, 2023 Sure, it's up to you at the end of the day. Context is just an option to help people write code that's in line with how a lot of frameworks like to structure things. You still use the GSAP object directly while using context though, context is just a way to group GSAP animations so they can be easily killed if necessary to prevent memory leaks or performance issues. It's not an abstraction. It is more necessary with React though, Vue is more forgiving! Good luck with your project! Link to comment Share on other sites More sharing options...
Rodrigo Posted January 22, 2023 Share Posted January 22, 2023 Hi, If your plugin is making the GSAP global constructor available without imports, it would be important for you to document GSAP Context for your users to be aware how to use it with your plugin. At the end of the day they have access to the same functionality and features, right? Basically what you have to do is use that particular gsap instance from your plugin and create a GSAP Context. Just to be sure and give the best possible solutions for everyone, would you be kind enough to fork this GSAP & Nuxt3 template and implement your plugin in it. Don't worry about GSAP Context yet, we'll get to that later, for now I'm interested in how it's implemented in order to see the next steps:https://stackblitz.com/edit/nuxt-starter-6nxgbu?file=app.vue Happy Tweening! 2 Link to comment Share on other sites More sharing options...
iotron Posted January 23, 2023 Author Share Posted January 23, 2023 17 hours ago, Rodrigo said: Hi, If your plugin is making the GSAP global constructor available without imports, it would be important for you to document GSAP Context for your users to be aware how to use it with your plugin. At the end of the day they have access to the same functionality and features, right? Basically what you have to do is use that particular gsap instance from your plugin and create a GSAP Context. Just to be sure and give the best possible solutions for everyone, would you be kind enough to fork this GSAP & Nuxt3 template and implement your plugin in it. Don't worry about GSAP Context yet, we'll get to that later, for now I'm interested in how it's implemented in order to see the next steps:https://stackblitz.com/edit/nuxt-starter-6nxgbu?file=app.vue Happy Tweening! Working example of context with gsap imported via nuxt plugin. For gsap club plugin implementation, check the slider page. Let me know if you see any performance issues on the setup.https://stackblitz.com/edit/nuxt-starter-t4ha6v?file=layouts%2Fdefault.vue,pages%2Findex.vue 1 Link to comment Share on other sites More sharing options...
Rodrigo Posted January 23, 2023 Share Posted January 23, 2023 Hi, Thanks for the example! ? Indeed as mentioned before your plugin makes the GSAP Core instance available without imports so you can use the same methods and create a context instance as you already did here: https://stackblitz.com/edit/nuxt-starter-t4ha6v?file=pages%2Findex.vue So it's usage should be similar but without importing the GSAP Core. Happy Tweening! 1 Link to comment Share on other sites More sharing options...
miguelst Posted February 9, 2023 Share Posted February 9, 2023 On 1/23/2023 at 4:08 PM, iotron said: Working example of context with gsap imported via nuxt plugin. For gsap club plugin implementation, check the slider page. Let me know if you see any performance issues on the setup.https://stackblitz.com/edit/nuxt-starter-t4ha6v?file=layouts%2Fdefault.vue,pages%2Findex.vue Is there a benefit to importing gsap via a plugin? As opposed to a direct import as in the other examples here? Thanks! Link to comment Share on other sites More sharing options...
iotron Posted February 9, 2023 Author Share Posted February 9, 2023 6 hours ago, miguelst said: Is there a benefit to importing gsap via a plugin? As opposed to a direct import as in the other examples here? Thanks! Benefit: single configuration file(plugin) for gsap Link to comment Share on other sites More sharing options...
Rodrigo Posted February 9, 2023 Share Posted February 9, 2023 Hi @miguelst, Basically you save yourself from importing the core files over and over in your Vue files, that's it. Of course the plugin could be enhanced in order to simplify other tasks but the main benefit will always be the same, not importing the core and the plugins you use and registering those plugins. Maybe create some low level API for some recurrent tasks and such things. I understand that a new GSAP Module is in the plans of the Nuxt team with Nuxt3. Happy Tweening! 1 Link to comment Share on other sites More sharing options...
miguelst Posted February 10, 2023 Share Posted February 10, 2023 20 hours ago, Rodrigo said: Hi @miguelst, Basically you save yourself from importing the core files over and over in your Vue files, that's it. Of course the plugin could be enhanced in order to simplify other tasks but the main benefit will always be the same, not importing the core and the plugins you use and registering those plugins. Maybe create some low level API for some recurrent tasks and such things. I understand that a new GSAP Module is in the plans of the Nuxt team with Nuxt3. Happy Tweening! Thank you! That makes sense Link to comment Share on other sites More sharing options...
Francesco Michelini Posted February 10, 2023 Share Posted February 10, 2023 Hi all, I just stumbled upon this exact "problem" with Nuxt 3.1.1, but I've been able to make it work only by omitting the `.client` part in the plugin file name. In my case, importing the SplitText and Draggable plugins made the entire application crash during development because at the very beginning the `window` object is still `undefined` (only on the first page load. instead, when navigating towards a page that used those plugins no errors were thrown). Maybe this will be helpful to others in the future ✌️ For reference ? // /plugins/gsap.js import { gsap } from 'gsap' import { ScrollTrigger } from 'gsap/ScrollTrigger' import { Draggable } from 'gsap/Draggable' import { InertiaPlugin } from 'gsap/InertiaPlugin' import { Observer } from 'gsap/Observer' export default defineNuxtPlugin(() => { gsap.registerPlugin(Observer, ScrollTrigger, InertiaPlugin) if (process.client) { gsap.registerPlugin(Draggable) } return { provide: { gsap, Observer, ScrollTrigger, Draggable } } }) 1 1 Link to comment Share on other sites More sharing options...
kobro Posted March 14, 2023 Share Posted March 14, 2023 Thanks to Rodrigo for setup code. I had a problem with ScrollTrigger and trigger area if using not fixed size images. When images are still downloading, ScrollTrigger already sets the wrong trigger area, but it's fine after reloading the page. So I found a solution to use onNuxtReady instead of onMounted. Maybe it will be helpful to others. onNuxtReady((app) => { console.log("Nuxt ready!"); gsap.timeline... }) Put gsap code in callback function and it runs after everything is downloaded. UsingScrollTrigger.refresh() as a callback for @load event broke native Nuxt scroll behaviour on route changed. For example, navigate to the page that uses refresh() leaves you at the scroll position from previous page. Nuxt 3.2.3. 1 Link to comment Share on other sites More sharing options...
Rodrigo Posted March 14, 2023 Share Posted March 14, 2023 Hi, For images a good alternative could be to use Nuxt Image, which is a part of the Nuxt ecosystem and developed by many members of the Nuxt team: https://image.nuxtjs.org/ The API for the two components includes a load event that allows you to keep track of the images loaded state and could be helpful to tell you when you should create your ScrollTrigger instances: As for the scroll position jump you can use ScrollTrigger's clearScrollMemory method: https://greensock.com/docs/v3/Plugins/ScrollTrigger/static.clearScrollMemory() Hopefully this helps. Happy Tweening! 1 1 Link to comment Share on other sites More sharing options...
iankco Posted April 11, 2023 Share Posted April 11, 2023 On 3/14/2023 at 11:20 AM, Rodrigo said: Hi, For images a good alternative could be to use Nuxt Image, which is a part of the Nuxt ecosystem and developed by many members of the Nuxt team: https://image.nuxtjs.org/ The API for the two components includes a load event that allows you to keep track of the images loaded state and could be helpful to tell you when you should create your ScrollTrigger instances: As for the scroll position jump you can use ScrollTrigger's clearScrollMemory method: https://greensock.com/docs/v3/Plugins/ScrollTrigger/static.clearScrollMemory() Hopefully this helps. Happy Tweening! For continuity, the topic indicated Nuxt 3, the nuxt-image package that is compatible with Nuxt 3 is @nuxt/image-edge. 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now