NPM dependencies vs devDependencies

What's the difference between dependencies and devDependencies in npm?

If you are creating just an application or a service, there isn't a difference in the usage. However, if you are creating a library, this following key part may help you understand the difference:

Anything is the devDependencies list will NOT be installed in the client application while everything in the dependencies list will be.

Why does it matter?

Scenario 1

Imagine your library is to offer a date time parser to its users. You may be using eslint for your development linting check. If you decide to put it in the dependencies list, when user install your library package, the eslint listed in your "dependencies" list will also be installed into users' node_modules folder, even if users have decided not to use any eslint feature at all for their applications. This increase the overall package size for their application if it is a Node JS application and also force the client to unnecessarily download the unused packages.

Scenario 2

Image your library is a UI library and is TypeScript based. You may have decided to also use another nice responsive table library as the base for your mroe customized fancy-table component. So you may have something like "table": "1.2.1" in your "dependencies". Because you are working in TypeScript, you need the type definitions of the table API. Luckily, they have already published @types/table for TypeScript users. Now the question is clear - where should you put it? The anwser is "dependencies" list. The reason is if it is left in the "devDependencies" list, users of your UI library won't have type information about the internal type where the base (table) of your fancy-table refers to. If your library users also develop in TypeScript, their TypeScript compiler will report missing type errors.

Lesson Learned

I learned this lesson in a hard way when I had to spend the entire day troubleshooting the typescript issues. Before deciding to install development related packages in the "devDependencies" list, think twice whether they are only development related or they truly constiute a dependency of your library.


Post a Comment

Popular posts from this blog

Creating a Library Project for Spring Boot

Spring Data Repository Query Precedence Tricks

Overwriting Spring Security Context through Filter