I ' ve thought about that a lot . I came to the conclusion , that you get most of the benefits with that you need with require . Forst of all testability . As you said , it ' s no problem to overwrite the modules with mocks so that you can very easily write unit tests . I ' m using jest for this and I am very happy with it . my codebase is entirely ES 2017 . The next point you don ' t really decide on the concrete implementation , as you only set the path to a module . This way , you can exchange the module in that location . I know this is nothing like exchanging the implementation directly in your code , but it works most of the times . Overall I ' d Say that js projects very rarely reach the scale where DI is really needed . This may be a reason , why this quirky way is ' good enough '