La plupart des gens ont uniquement dependencies et devDependencies, mais il est important de comprendre le rôle de chacun de ces types de dépendances.
dependencies
Ce sont les dépendances normales, à savoir celles dont vous avez besoin pour faire tourner votre code (par exemple React ou ImmutableJS).
devDependencies
Ce sont les dépendances pour le développement, des dépendances dont vous aurez besoin à un moment ou un autre lors de la phase de développement, mais pas pour l’exécution du code (par exemple Babel ou Flow).
peerDependencies
Les peer dependencies sont un type spécial de dépendances auquel vous serez confronté qu’à partir du moment où vous publiez votre propre package.
Avoir une dépendance peer signifie que votre package a besoin d’une dépendance qui doit être exactement la même dépendance que la personne qui est en train d’installer votre package. C’est utile pour des packages comme react qui ont besoin d’avoir une seule copie de react-dom qui sera également utilisée par la personne l’installant.
optionalDependencies
Les dépendances optionnelles sont exactement ce qu’elles mentionnent : optionnelles. Si Yarn ne parvient pas à les installer, le processus d’installation sera quand même réussi.
C’est utile pour les dépendances qui ne marchent pas forcément sur toutes les machines et pour lesquelles vous avez une solution alternative dans le cas où elles ne sont pas installées (par exemple Watchman).
bundledDependencies
Tableau de noms de packages qui seront intégrés à votre package lorsque vous le publierez.
Les dépendances de ce type devraient se trouver dans votre projet. La fonctionnalité est essentiellement la même que les dépendances normales. Ces dépendances seront également embarquées en exécutant yarn pack.
Les dépendances normales sont généralement installée depuis le registre npm. Les bundle dependencies sont utiles lors que les dépendances normales ne suffisent pas :
- Lorsque vous voulez utiliser une bibliothèque tiers qui ne vient pas du registre npm ou bien que vous avez modifiée.
- Quand vous voulez utiliser vos propres projets comme modules.
- Lorsque vous voulez distribuer certains fichiers avec votre module.
What exactly is a package manager?
We've met npm already, but stepping back from npm itself, a package manager is a system that will manage your project dependencies.
The package manager will provide a method to install new dependencies (also referred to as "packages"), manage where packages are stored on your file system, and offer capabilities for you to publish your own packages.
In theory you may not need a package manager and you could manually download and store your project dependencies, but a package manager will seamlessly handle installing and uninstalling packages. If you didn't use one, you'd have to manually handle:
In addition, package managers handle duplicate dependencies (something that becomes important and common in front-end development).
In the case of npm (and JavaScript- and Node-based package managers) you have two options for where you install your dependencies. As we touched on in the previous article, dependencies can be installed globally or locally to your project. Although there tend to be more pros for installing globally, the pros for installing locally are more important — such as code portability and version locking.
For example, if your project relied on Webpack with a certain configuration, you'd want to ensure that if you installed that project on another machine or returned to it much later on, the configuration would still work. If a different version of Webpack was installed, it may not be compatible. To mitigate this dependencies are installed locally to a project.
To see local dependencies really shine, all you need to do is try to download and run an existing project — if it works and all the dependencies work right out of the box, then you have local dependencies to thank for the fact that the code is portable.
Note: npm is not the only package manager available. A successful and popular alternative package manager is Yarn. Yarn resolves the dependencies using a different algorithm that can mean a faster user experience. There are also a number of other emerging clients, such as pnpm.
Package registries
For a package manager to work, it needs to know where to install packages from, and this comes in the form of a package registry. The registry is a central place that a package is published to and thus can be installed from. npm, as well as being a package manager, is also the name of the most commonly-used package registry for JavaScript packages. The npm registry exists at npmjs.com.
npm is not the only option. You could manage your own package registry — products like Microsoft Azure allow you to create proxies to the npm registry (so you can override or lock certain packages), GitHub also offers a package registry service, and there will be likely more options appearing as time goes on.
What is important is that you ensure you've chosen the best registry for you. Many projects will use npm, and we’ll stick to this in our examples throughout the rest of the module.
Using the package ecosystem
Let’s run through an example to get you started with using a package manager and registry to install a command line utility.
Parcel is a(nother) tool that developers commonly use in their development process. Parcel is clever in that it can watch the contents of our code for calls to dependencies and automatically installs any dependencies it sees that our code needs. It can also automatically build our code.
In our previous chapter we installed Prettier as a global tool. Here however, let’s use npm to install Parcel as a local tool, as best practices dictate. We'll install it as part of an experimental app.