I have a rather large project A using Node and Typescript. In project A I have a lot of different modules that I would like to reuse in another project B.
Therefore I have built the project A with this tsconfig.json:
{
"compilerOptions": {
"target": "es2017",
"module": "commonjs",
"declaration": true,
"outDir": "./dist",
"sourceMap": true,
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"typeRoots": ["./node_modules/@types", "./modules/@types"]
},
"exclude": ["node_modules"]
}
So all the files are built into the /dist folder this way:
To use these moduleA and moduleB in another project, I add the following to the package.json in Project A:
"name": "projectA",
"version": "1.0.0",
"description": "...",
"main": "dist/moduleA.js",
"typings": "dist/moduleA.d.ts",
I use yarn workspaces to access Project A as a package in Project B. But problem is that I can only access moduleA, when using import {ModuleA} from 'projectA'
in my new project B? So how can I access more modules from ProjectA?
Every module can have two different types of export, named export and default export. You can have multiple named exports per module but only one default export.
Use named exports to export multiple classes in JavaScript, e.g. export class A {} and export class B {} . The exported classes can be imported by using a named import as import {A, B} from './another-file. js' . You can have as many named exports as necessary in a file.
Declaring a module. exports object in a file specifies the values to be exported from that file. When exported, another module can import this values with the require global method.
To export multiple functions in JavaScript, use the export statement and export the functions as an object. Alternatively, you can use the export statement in front of the function definitions. This exports the function in question automatically and you do not need to use the export statement separately.
Would simply consolidating all exports in one index.ts
do the trick for you?
package.json (projectA):
{
"main": "dist/index.js",
"typings": "dist/index.d.ts",
...
}
index.ts (projectA):
// Adjust the relative import paths
// and identifiers to your structure
export { ModuleA } from "./moduleA";
export { ModuleB } from "./moduleB";
Some module in projectB:
import {ModuleA, ModuleB} from 'projectA'
I believe what you are looking for is: https://nodejs.org/api/packages.html#packages_package_entry_points
Not clear if TypeScript currently supports it or not: https://github.com/microsoft/TypeScript/issues/33079
It does appear you can work around it though with something like this in your package.json:
{
...
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"typesVersions": {
"*": {
"dist/index.d.ts": [ "dist/index.d.ts" ],
"*": [ "dist/*" ]
}
},
"exports": {
".": "./dist/index.js",
"./": "./dist/"
},
...
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With