AnswerBun.com

Package.json with multiple entrypoints

Stack Overflow Asked by Jeanluca Scaljeri on July 29, 2020

I have a library which was used as follows

import { Foo } from '@me/core';
const foo = new Foo();

The package.json of that library looks like

"name": "@me/core",
"version": "1.0.0",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"license": "MIT",
...

With dist/index.js its entrypoint. Now, however, I would provide an import for NodeJs projects only and one for web projects. Ideally I would have something like this for NodeJs

import { Foo } from '@me/core/nodejs';

and if you’re working on a web-project you could do

import { Foo } from '@me/core/web';

My understanding is that both @me/core/nodejs and @me/core/web will be different NPM packages this way, which is not what I want. I want it to be in 1 npm package.

I tried to changed the library’s index.ts file, from

export * from './foo';

into

import * as nodejs from './nodejs';
import * as web from './web';

export { web, nodejs };

This actually works, but I have to use it now (in a NODEJS project) as follows

import { nodejs } from '@me/core';

const foo = new nodejs.Foo();

Is there maybe a way to import this such that I don’t need the nodejs everytime?

As you can see I’m not so sure what I should do here so any help would be appreciated!

UPDATE: Based on the suggestions by @Klaycon I see the following error:

enter image description here

One Answer

As you're using ECMAScript modules, please refer to node.js docs on package entry points:

In a package’s package.json file, two fields can define entry points for a package: "main" and "exports". The "main" field is supported in all versions of Node.js, but its capabilities are limited: it only defines the main entry point of the package.
The "exports" field provides an alternative to "main" where the package main entry point can be defined while also encapsulating the package, preventing any other entry points besides those defined in "exports". This encapsulation allows module authors to define a public interface for their package.

So, in your package.json, you could define exports like this:

  "main": "dist/index.js",
  "exports": {
    ".": "dist/index.js",
    "./nodejs": "dist/nodejs",
    "./web": "dist/web",
  }

Correct answer by Klaycon on July 29, 2020

Add your own answers!

Related Questions

What will this recursive function yield?

1  Asked on December 9, 2021 by user13812739

     

How to style Rebass Switch

5  Asked on December 9, 2021 by amaster

       

Redis Cluster Mode – replicas not working

1  Asked on December 9, 2021 by ramprakash

     

Disable seeking in mediaelement.js

1  Asked on December 9, 2021 by pelirrojo

         

Table not getting created sqlite android

4  Asked on December 9, 2021 by user3844417

   

Angularjs using JWT breaks CORS to Amazon S3 on login

2  Asked on December 9, 2021 by codephobia

     

Write a value with opc ua Python

2  Asked on December 9, 2021

   

unable to install vue chart.js in vue

2  Asked on December 9, 2021 by prabina-sht

   

Ask a Question

Get help from others!

© 2022 AnswerBun.com. All rights reserved. Sites we Love: PCI Database, MenuIva, UKBizDB, Menu Kuliner, Sharing RPP