 Okay, I guess we should get started. I Hate microphones. I can't move around and like wave my arms with them, but I'll have to make do anyway so This is a session called manage those dependencies and as you could guess already My name is Jacob and my Twitter handle happens to be exactly my name so if you want to To say something during during the talk give some feedback or maybe you just want to access the slides afterwards then I'm going to write those things on on Twitter and I've been Encoding a lot for a long time Many different companies many different languages and so on but I don't want to stand here and like recite my resume So you can just look me up yourselves if you want to What I do want to say is that I'm from Sweden and Is anyone else in here from Sweden? They're actually too awesome, then you can talk now because When I go places and say that I'm from Sweden people most often at least have some some kind of idea of what Sweden is like and Most people think something like this that Everyone walks around and like a coat and this brutish men and And always complaining about the fact that winter is coming but but I tell you Sweden is nothing like that because Ned Stark have no idea what winter is like. You have no idea what winter is like This is what winter is like So Anyway, I'm not here to talk about the weather but to talk about dependency management once again and Before I start I just want to say this So, yeah use your brain like don't take everything as truth But yeah, you use the bits and pieces that you find useful and and question everything And also, I I'm not here to talk about building like homepages for your kitten I'm here to talk about actual apps building building real apps that are complex and somewhat huge at least and Let's start with some some quizzing I actually found this quote a while back that said It was talking about a particular piece of technology and it said that it's a piece of the stack That's been notably missing for years and after using it for a while now. I'm not sure how I lived without it And when I googled around for this a bit I realized that people have had been saying this about source control like I started out coding without source control for I think maybe three years or so when I was in high school and I often copied my folders to like back up things in case I would screw something up Until next day or whatever. So this could definitely been said about source control but it has also been said about something else in this case and You can probably guess but let's rewind the tape and and look about what's happened in in a couple of different environments so I personally at least discovered Unix in about 99 before that I was purely a windows guy and The thing I found coolest about Unix of all the things was the fact that you never like downloaded These executable files to install stuff and had to choose which directory and where in your start menu You wanted things to be installed You had a command a simple one liner that installed something for you And you could put this as part of a script that would like install a whole setup or Install a machine to the exact specifications that you wanted and that that was really cool in my opinion And then as time went by I discovered the Mac as well and realized that oh There's software for the Mac that can actually do this as well Even if it's not as out of the box as as pure Unix And suddenly it started appearing in programming languages as well. I first encountered it in Ruby Where you have Ruby gems Where you do exactly the same thing you install the the piece of software that you want to use alongside your own code and It's not limited to To software or to building software anymore But even actual actual end users follow this pattern now sin since the app store Where you just you go to some place and you download and you install and it's done can't really script it But it's pretty much the same thing And lately I've been doing a lot of node JS where you have exactly the same thing again with MPM So of course, you know what I'm getting at already The theme at least so this quote once again was taken from one of the Microsoft evangelists talking about the Microsoft stack and in particular the the tool called nugget Which does exactly this for the dot-net framework. So so even Microsoft is catching on But what I want to ask here today and since this is the front end track is What's the JS approach to this? I am not talking no JS. I'm talking about client-side browser stuff How do we manage dependencies in general and That as usual with all kinds of technologies and all processes and so on there's a ton of different ways but the most common one and the one I think you've all used from time to time may be still is To find a library that you want to use like jQuery. Everyone wants to use jQuery So you look it up on the web You download the source You put it in a folder somewhere structured in in your project And then you let the global pollution begin Because you want another library and you want another library So this pollution that's just the beginning you start like piling these things on top of each other Like all these different things that you want to use you find somewhere and And this picture is even not that descriptive. I feel it's more like this usually and It becomes a maintenance nightmare and I suppose most of you have actually felt this if you work with Front-end development Don't touch the wires. Yeah, don't touch the the dependencies We've downloaded because this thing only works with this version and this thing only works with that and it's a house of cards And it that's not the whole story because it also brings a whole bunch of stupid habits Going about this in this way, so For example, we start to we want to minimize our our sources, right and concat files before we deploy And that's kind of a problem because if there's not a semi-colon in the end of a file that you're concatenating with another You can run into problems. So people start adding semi-colons to the beginning of their files, which is like what? What are you doing? Why do we need to do stupid hacks like that? And we start to do like premature minimification every everything we download Can be downloaded as a minimified version or a non-minimified version And if we download the non-minimified we have to do it ourselves and if we download the minimified one we have to We have a hard time debugging our code. So maybe we download both of them and even start increasing the mess even more Because we want to minimize in the end anyway, not like before we've finished and There's also no choice, but to check in dependencies That's like a discussion of its own whether or not you should actually do that But in this case you have to because you have downloaded them from an arbitrary source and and you have to put them alongside your code and Since we're already copy and pasting libraries Like jQuery this and this for the version and underscore this and that version and so on Why not copy and paste some small pieces of code that we have in our different projects because those are like libraries? Right, so we we we kind of encourage copy and paste coding by by just downloading source and putting it in in our projects, so if you ask me the whole thing is like This is my feeling about it. It's just shit and You can ask like why why is it this way why why are we developing this way why Why are we as web developers doing this in a different way than other people and I think the problem Of course originates with the fact that the web is It's like a toy. It's like JavaScript It's it's for adding adding stars that blink on on your side, right? So web developers for a very long time have been seen like this for more like system close developers It's like a toy language a toy environment where you do toy things or like an Add person or something creating a website, but it's it's not true anymore, right? It's not like that and haters gonna hate but front-end devs were like script kiddies It's not like that anymore, right? You know it and Just to back it up JavaScript is like super popular if you look at github JavaScript is It's actually 21 percent of the entire code there and I actually actually updated this slide just a month ago and I created it first a year ago and Obviously JavaScript is even more popular now It was like 19 before and now 21 and the funny thing is that none of the others had changed at all Except one that changed 1% I don't remember which one but the big change that had happened was that coffee script was suddenly here one year I go coffee script wasn't on the top 10 chart. So these 3% are actually JavaScript as well in a sense So JavaScript is really really increasing in popularity and and the medieval ages are kind of over We're not doing it want to do we don't want to do things in Playful just copy and pasting kind of way anymore. So that's that's what this talk is is all about and My idea is to cover a couple of different methods For dealing with this or tools rather So these are the ones that I want to talk about and I guess could start by asking is there anyone in here who know what all of these are just from looking at the logos Up with your hands in that case One maybe okay, then then you can leave because you know everything already But the rest of you have something to learn at least and hopefully you'll run learn something new as well So I'm gonna run through these Rather quickly, but just talk about what is it? How is it different compared to the other ones and what's there like strength and weaknesses in each of these approaches? But before we actually get to these Browser centric tools. I first want to say something about MPM Which is the node package manager and I suppose most of you know about node at least Which is a JavaScript environment or a platform for running JavaScript on the server? But how many in here have actually worked with node? Just a few okay good, so then it's useful to actually go through this so in in node you You simply do something like this when you want to to install a Library that someone else has written on the command line or it's actually really dark Well, I hope you can see it Otherwise you simply have to have to look up the slides afterwards and what I'm saying will hopefully be enough so we We use it to install packages and we do it by just saying MPM install and then whatever on the command line And it installs that Library into the project that you're currently in and then you can start using it in your in your server side JavaScript node code And you do I wonder if we can actually increase the Light somehow I guess you can't read this Yeah, not much to do about that now Sorry Wonder where's the switch? Yeah, someone could try Talking in darkness. Yeah, okay Good thing that it's not filming my face I think the highlighting most of the text is white. So only parts Will be hard to read and most of it will probably be seen anyway So And you can do this if you really want to if you go to speaker deck comm Slash Jacob Madsen you can find this presentation and follow it on your own laptop or whatever but anyway Another control question before we continue how many people in here are actually writing JavaScript now and then Okay, pretty much everyone. That's good. And so All the code here is just regular JavaScript except for this Require function which we use to import one of the the modules that we've installed and then we can use whatever functions it exposes Like this we get the object foo and then we we call the square method on on the foo objects and It's really easy to like publish a package using npm. You just The clarifying like this called the package.json where you say the name of your file Which are the main name of your project which has to be unique and then you have some metadata here about like What does it do so people understand it and what version is this and What other packages is this depending on and so on So that's how npm works and how we work with With packages on server-side JavaScript and I'm going to relate back to that when we look at the browser here So let's start from the beginning and look at the one. I think was developed first and at least was the one I encountered first Which is called Ender and The guys develop who developed Ender Thought of it as the no library library that instead of pulling down lots of different libraries You are supposed to kind of specify that which libraries you want and Bundle them together into like the complete package so to speak that you need And it's it's also a tool that you use on the command line You install Ender and then you say Ender build and then you name lots of packages that you want to install and Another agenda they kind of had was to to replace JQuery which was kind of monolithic where you got all these features at once and maybe you didn't need all of them So they built a couple of packages that Exposed parts of the similar functionality that jQuery had like a dumb ready function a query language for for querying dom nodes Using in CSS electors and so on and then other packages like underscore and yeah, whatever could be installed using Ender So you just say the names of your packages that you want an end Automatically fetches them and puts them into a file and you can include that file called under JS on your site And now all these things are there so you don't have to go out and browse the web for these things and you just use it The jQuery way so to speak it adds all of these libraries on to the dollar So you can use the map function from from underscore you can use the querying from the query package and and so on but I Don't think this is really really that useful because it makes things a little simpler you kind of eliminate the need to To do things arbitrarily and you have a systematic approach But it's not really structuring things differently because everything ends up on the dollar So everything you add is kind of global There's no No, like resolution or management of how how these things are supposed to interact everything's just crammed together And obviously it doesn't play well with jQuery because it uses the dollar and I found that quite challenging because it's Honestly, it's hard to to be without jQuery and Even if you don't use it jQuery itself, maybe you need a plug-in or two that depends on jQuery and yeah, then you're fucked so Moving on there are some other tools then that have like a larger idea and One that I really like is the one called browser if I And if any of you actually work with this or Or use it then you will know that this is the version one browser if I logo not the second one I've actually not migrated myself. So it would be kind of a lie to use the new one up there when I'm talking but the idea of it is to enable the node style package management in the browser and Yeah, and It uses the same pattern as a node, which is called common JS Which is a project with a goal of specifying an ecosystem for JavaScript outside of the browser and the weird thing now Is of course that we bring it back to the browser, but yeah anyway So it looks like this exactly like Like when we run code on node Except that now we say require and then we give a file path, which is where we'll find The files that we want to include So instead of running all our JavaScript as a long series of things in the same file executing all at once we can now split our program into separate files and Delay the running of them until we say require and then for JS or bar JS and so on and then we can start using the things they are exposing and The way you you would define the package in this case for example foo.js would be to do something like this We say exports dot square So we put the square function on a magical object called exports and Then we define the function to do whatever we wanted to do squaring hopefully so This will then this exports object will be the thing returned To the foo variable when we say require foo so everything will be available that we put on the exports object and This print line here console log loaded foo will be run as well when we include the foo package And now we do exactly the same thing with the bar package. We just expose some some variable we expose some function Yeah, we print something so if we run this What will happen is that The exports objects are returned from foo and bar respectively and then we print we want to print the square of four and Yeah, the version of bar and the cube of four So the word that things will be printed here is that first it will say loaded foo Then it will print the square of four then it will say loaded bar and then it will print the the remaining two things So the code in these files are it's not executed until you run require and that's kind of the important thing And Now I'm just talking about files that you have locally of course But the point is to use this regarding other people's code, of course so you include something else than what you've written yourself and Something that we can do is To load code dynamically because the require function takes a string as an argument and that string is not like Nothing is done with it at compile time. It executes when it executes. So we could toss a coin and Randomize whether we want to load the foo or the bar package and Then try to use the result that comes out of that And and log the version of that package and since the foo package We had before didn't contain a version variable that we print undefined if it loads the foo package And if it loads the bar package, it will print Yeah, whatever version we put in there. So So you can do this. It's kind of weird. I'm not sure if it's If it's something anyone has ever done for a good reason in production, but it's possible So where where browser if I comes in here is that browser if I is a little tool That takes this code that you write in this way and adds kind of the glue to make this work in the browser so Once again after you've written your code you have to you have to use a command line to To say that I want to browser if I my main.js file And I wanted to output a new file called bundle.js And it will open the main.js file and it will figure out what other files it depends on and then produce this bundle file and then you can add the bundle file into your site just as with With Ender So Like I said We can use this relative required To files that we have in our own File system or we can say require and then the name of a module for example Dom ready Which exposes a module that we have not written but is stored in the npm index and is put right into our program automatically So it's it's like Ender in the way that you install packages by naming them but it doesn't put everything into the global scope and makes it available everywhere But it returns it to a particular variable and then you can use that in its own context You can include it in just one of your files. You can include it Inside a function. I think I actually have an example of that. Yeah instead of just requiring a file Everywhere you can put it inside of a function scope and just use it Where you need to use it and then it won't clash with other things that your program depends on It works really simply It's a really simple process actually You don't really have to understand it But the only thing it does is that it wraps all of the files that you've written that looks like regular global JavaScript code into It pastes it into a boilerplate that looks like this Where the top is the name of the file and then it exposes a few variables that are the the magic ones that Enables this whole thing like the exports we've already seen and they're required to load the other files And of course require or buzzer if I creates this require and this defined function That's that's running here But you don't really have to know the details you can read read about it yourself And a cool thing is that this resolves nested dependencies so if I If I use browser if I and I load jQuery Then when I say require jQuery, I will get a variable back That is my jQuery object, and I don't have to put that on the dollar. I can name it whatever I want to So if I have something else that uses the dollar It's totally okay, and if I want to require one one version of jQuery in one function and another version of jQuery in another Function that's also completely okay because those functions are isolated and if I require two different jqueries that works perfectly fine and even better if I use a plug-in Or I use some code that requires some version of jQuery MPM will automatically get That dependency for me if I need for example Maybe some of you have used Backbone for building like a client-side architecture MVC so and so on it uses underscore as a dependency and if If you're using a jQuery plug-in that obviously requires jQuery to run. So you just have to You just have to ask for the thing you want and all dependencies that are needed to make that work are downloaded automatically and hidden inside of that you don't even know that it's installed and Therefore you can have different versions of jQuery at the same time supporting different different plugins that you run And you don't see any of that complexity. It just works so In some way it kind of unites the way you think of server and client if if you work with node and JavaScript in that way You just do it exactly the same way as you would if you were in a server environment and If we look at the pros and cons then it's kind of a very simple and reasonable model you just You just ask for things you want and if they are available in the global registry it downloads them from there put it in Gets all the dependencies you only worry about the top layer. You don't have to think about what's underneath and You get all the power and popularity of MPM, which is the fastest-growing package manager right now At downside of course is that it still bundles everything into one file so you can't really control how to How to load these scripts on your site For example, if you want different scripts on different pages on your site Then you have to run browser if I multiple times once for each site And you can't do dynamic thing or you can do dynamic things But if you want to for example load something when someone not open a new page, but clicks a particular button or Or delete something or whatever If you want to load a new JavaScript file at that moment to use some some new features Then you have to package that using browser if I As well, so you have to run browser if I once for each little use case you have in your application If you can't just bundle everything into one file and you're satisfied with that So that brings us to the next one, which is require JS Which I suppose a few of you have heard about Some hands to see up with your hands if you heard about it or used it not that many, okay? So the goal with require JS is Kind of the same thing they they also want to solve this problem but they do it in a quite quite different way and An important difference compared to the MPM and browser if I solution is that required JS is not a package manager Browser if I is not the package manager either and MPM is the package manager It has all the packages it knows all about the dependencies and so on browser if I is a tool to download these dependencies and Put them together in a structured way that makes it usable for you. So What require JS is is similar to browser if I it doesn't download anything for you Oh, no, it's even if it's even more specific than browser if I it doesn't download anything for you the same way browser if I does It's not aware of any package managing system. It's not aware of MPM. It's just a way to To bundle files together In a more generic way than the other tools did So let's look quickly at how that works Confusing require also creates Global function called require just like browser if I did but it's not the same function. This is a completely different one They just use the same name So competition deluxe This require function does not return a value. It's asynchronous like Like you're using Ajax or set time out or whatever it takes a function as a callback argument So here is that you give it an array of all the the files or or packages that you want to include and Then this function will return objects Containing those those files or packages so that you can use them inside of this function doesn't return it in the normal way and Obviously, there's a big difference here Because this enables us to to delay the loading of this This package we don't have to return it So if we have to wait a while if it has to be downloaded like on the fly This would not block the program the same way as browser if I would have done Because JavaScript only has one thread and if a function takes a long time to return We can't do anything else. So that's not okay, but in this case the program could continue running And idea is exactly the same as in in browser if I you just build up an object that Exposes all the functionality that you want to expose from your package and you return it But obviously it doesn't return immediately like I said instead. You just You return it from this function inside here so we can expose a function called through and a variable called bar for example And instead of writing the dependencies this way where we say that I want I want to depend on object one and object two And then have them passed into this function I can actually use the the same syntax as in The common JS like alternative that browser if I uses we can just say require and then the name of the dependency and and get it back immediately If we don't pass the array and give a require argument instead and this is just syntactic sugar It does exactly the same thing as what you saw before. It's still asynchronous. It's still It still works exactly this way. It's just a different syntax for specifying These names that might look more familiar in that But the difference of course is that this is statically analyzed required JS looks through your source code and reads all these require statements To know what it should love should be loading when this function starts so so Having these dynamic dependencies Like we did before with the time cost and then loading something arbitrarily that won't work here because the The packages will start to load before the code is run Like here we start loading dependency one dependency to before this function executes So they are passed into the function as arguments But that's not really a problem because no one does that anyway, but just understand the kind of limitation So the difference here is that the loading of our modules is lazy It doesn't happen as we write it and we then have to wait for it, but it It starts when we write that we want to use them, but it doesn't continue running The piece of code that uses them until they're ready And like I said, also, there's no package manager coupling. It doesn't depend on a particular system to fetch these These packages, but you can add you can use any package manager. That's compatible with require So If we in this case wants to we want to load some new code When we click a particular button or so on we don't move to a new page So we don't reload the page automatically, but we just want some new code to be usable then this would be a perfect approach because We It will be able to load that on-demand like exactly when that code executes and not block and it automatically generates like which It splits your program up to different files that you can load Separately so this let me go back this one that depends on one and two That can be bundled into one file So that starts loading when this when this code is run But you don't have to load that file up immediately in your program. You can start loading it When you need it But that's that's what will happen automatically The downside to this compared to browser if I is that while browser if I the browser if I model is a Simple and easy to understand and it's synchronous and so on The price that you're paying for Doing things asynchronously is is as as usual when we're doing asynchronous things that It suddenly starts to get hard to understand. What's going on? What's loaded when and how do I optimize the order of when these things happen? like how big chunks should I split my Application code into to optimize performance One huge bundle. Well, that takes a long time to load when the app starts So that's bad, but lots of files to load in parallel and load All of the time when I move around in my application. That's that's not the best solution either You have to like find the middle way and while browser fight doesn't allow you to do that But always bundles it into one thing Require js allows you to do it, but it doesn't really help you do it You have to figure out the best way to go about it yourself so Moving on If you have any questions, by the way, you can just yell them out, but otherwise we'll do a session at the end So now now lastly I talked about two different ways to in your code organize What should be loaded when and how things depend on each other? if we look at the other part of this, which is actually actually Storing and retrieving these packages that are reusable pieces of code We can look at this thing called jam Which is a package manager for JavaScript just like MPM but unlike other Repositories they're talking about MPM. Of course, we put the browser first and This is not going to be very Very different from what you've seen before it's exactly the same thing We have a new program this time It's called jam and we say jam install jQuery and this installs jQuery onto your current project But it has no way to load them to to integrate them into your JavaScript code so you have to use some Some dependency management system Or module loader on top of that for example require and if you If you've specified that you want to use jam and require together it will create a file called Yeah, in this case jam slash require dot j s that you can load. So this is the symbiosis between these two And Yeah, since it's used with required j s it looks exactly the same as the thing we saw before we can say required jQuery The function gets back the jQuery object and then we can start using it right there And we can publish packages the same way pretty much as we did with MPM But the file looks slightly different and it has a different name, but we still specify What's this piece of code that I've written called? What's the current version? What other dependencies do I have? and so on And you can do it at the same time this is actually an example of doing it at the same time where the dependencies object up here is for MPM and the jam dependencies down there are for for jam if they for some reason would be different So yeah Jam compared to MPM is is targeted at browsers MPM has lots of packages that depend on access to the file system web server stuff other protocols like TCP and so on That you can't really use in the browser. You can install packages that are not usable While jam is just for the browser it contains browser stuff only And the downside is that the index is definitely not as large as MPM it's the the little brother and It adds some packaging overhead if you want to work with both Systems and if you want to be compatible with both everyone who creates a package suddenly has to maintain twice as much complexity and integration so There's an even simpler or more. I should say Less abstract version of these that's called power Which has gained a lot of traction like the last year or so it's created by Twitter and That as well as a package manager like MPM and like jam But what they're trying to achieve is to quote them build a generic Unopinionated solution to the problem of front-end package management so they want to be kind of the platform for all the other tools to to build upon and It's actually dead simple Because baller does not store store files. It just it's just like It's more like a name server or something it maps names to whatever Yeah, you want those names to mean So you can use Bauer to say install jQuery or you can install a git URL You can install a URL to an a JS file. You can install Something that you have locally whatever can be installed and and when you say like in the first one Bauer install jQuery what it does is the same thing as in the three next lines It just installs some file somewhere and the people who have created jQuery have specific have Have submitted to Bauer what jQuery points to what file does that mean? So it's pretty much just a URL as well, but masked behind the name so Just as with others you can create a file you can say in my project. I want these different Packages I want to use mocha. I want to use angular. I want to use select two. I want to use bootstrap I want to use jQuery and then you do a Bauer install the same way as With other tools and all of those are installed and readily available for you to use except that There is no system here to load these files and so on this puts Put some of the files that you wanted into your file system And then you you have to load them the old-fashioned way using a script tag pointing to that particular file So the idea that Bauer has is that the other tools the the jam jam package manager or Require and so on can be built to support Bauer to use Bauer Underdhood to fetch things but then supply the more abstract way of of using them So The difference here is that it's This is like super simple borrower is just One liners on on your command line and you fetch the files and it looks as if you had downloaded it yourself But you don't have to search the web and like figure out what versions you need and so on At the time you You download you write this file instead say all the versions at once and it's all there specified in a structured way And it's very flexible you can you can Can use it or is or you're at least supposed to be able to use it together with the other tools And the downsides of course is that using just Bauer doesn't really do a whole lot for you It doesn't take take it the whole way. It just downloads files for you But it's it's a very simple tool to get started with if you've never used any of these To just see kind of the idea and what it's all about so if we try to draw some conclusions From these like very very brief overviews I definitely had not covered exactly how to use everything and Like how they work, but now you know of some of them and can start looking but Just as as like templating engines in the JavaScript world is is like a weed There are so many I guess a lot of you have seen Linked-ins comparison when they wanted to choose a template engine for their news sites and they did this Study of 38 different templating engines in order to find the best one in 38 solutions to exactly the same problem that's like crazy and Frameworks are like a weed these days as well, right with jQuery and lesson backbone and knockout and yeah everything We have frameworks for everything So while while JavaScript is great because it has so many different environments and different solutions JavaScript is also hard for the same reason and that applies to this package management and dependency management as well Like which one should I be using? Which one is right for my use case and Yeah, where where where should I start? That's the problem? and I Think we While we should be more like this and just like embracing Embracing the fact that we can't know everything up front. We just have to start using something and see where it takes us and so on All developers are more like this. I want to have the coolest tools I want to do everything the most awesome way right away and everything should be awesome But let's let's just do a quick review of some use cases for for when they would be applicable So I would say that if you have a small app And you don't reload a lot. Maybe you're writing a like a single page application or such and Maybe you're a Node.js fan Any of these then MPM members if I is a really good way to go While if you have a huge application That's really hard to get a grasp on you definitely don't load all of the code up front And it's really hard to optimize that by hand Then look at jam and require JS instead because they are designed to tackle that particular use case and if you're more like I Want to take some baby steps. I just want to start scratching the surface of this thing or maybe you're You're actually having an idea of an even better way to do all of this then what's already out there Then power is really good because then you don't have to start from the absolute bottom where we just download sources from all over the internet but you can reuse something and If there's something you should never do for for any reason because it just doesn't make sense is to use something like the Ender library It was written way back before the rest of these ideas emerged and there's not really any reason to use it anymore But I would say that The most important thing is to just do your homework use your use your brain think about what is it that I want and Go with that and just whatever you do just stop piling things on top of each other That's it for me. Thank you. So that's a rush through different Technologies any questions? Everyone is just keen to Try something out get your hands dirty I don't have a live example with Drupal But I have live examples with all the rest and I can I can tweet some links So if you there's my my Twitter handle Follow it and I'll I'll let you know and they're all compatible with all back-end frameworks They're not coupled in any way with node or anything else. So Drupal is perfectly fine. Okay? If there's nothing else then Thank you so much