THIS PLUGIN IS NOW PART OF THE OFFICIAL MODULE FEDERATION ORGANIZATION
Bundler agnostic plugins to share federated types.
npm i -D https://github.com/ilteoood/native-federation-typescript
This module provides two plugins:
This plugin is used to build the federated types.
{
moduleFederationConfig: any; // the configuration same configuration provided to the module federation plugin, it is MANDATORY
tsConfigPath?: string; // path where the tsconfig file is located, default is ''./tsconfig.json'
typesFolder?: string; // folder where all the files will be stored, default is '@mf-types',
compiledTypesFolder?: string; // folder where the federated modules types will be stored, default is 'compiled-types'
deleteTypesFolder?: boolean; // indicate if the types folder will be deleted when the job completes, default is 'true'
additionalFilesToCompile?: string[] // The path of each additional file which should be emitted
compilerInstance?: 'tsc' | 'vue-tsc' // The compiler to use to emit files, default is 'tsc'
}
Note that, for Webpack, the plugin automatically inject the devServer.static.directory
configuration.
This plugin is used to download the federated types.
{
moduleFederationConfig: any; // the configuration same configuration provided to the module federation plugin, it is MANDATORY
typesFolder?: string; // folder where all the files will be stored, default is '@mf-types',
deleteTypesFolder?: boolean; // indicate if the types folder will be deleted before the job starts, default is 'true'
}
Vite
// vite.config.ts
import {NativeFederationTypeScriptHost, NativeFederationTypeScriptRemote} from 'native-federation-typescript/vite'
export default defineConfig({
plugins: [
NativeFederationTypeScriptRemote({ /* options */ }),
NativeFederationTypeScriptHost({ /* options */ }),
],
/* ... */
server: { // This is needed to emulate the devServer.static.directory of WebPack and correctly serve the zip file
/* ... */
proxy: {
'/@mf-types.zip': {
target: 'http://localhost:3000',
changeOrigin: true,
rewrite: () => `/@fs/${process.cwd()}/dist/@mf-types.zip`
}
},
fs: {
/* ... */
allow: ['./dist']
/* ... */
}
}
})
Rollup
// rollup.config.js
import {NativeFederationTypeScriptHost, NativeFederationTypeScriptRemote} from 'native-federation-typescript/rollup'
export default {
plugins: [
NativeFederationTypeScriptRemote({ /* options */ }),
NativeFederationTypeScriptHost({ /* options */ }),
],
}
Webpack
// webpack.config.js
const {NativeFederationTypeScriptHost, NativeFederationTypeScriptRemote} = require('native-federation-typescript/webpack')
module.exports = {
/* ... */
plugins: [
NativeFederationTypeScriptRemote({ /* options */ }),
NativeFederationTypeScriptHost({ /* options */ })
]
}
esbuild
// esbuild.config.js
import { build } from 'esbuild'
import {NativeFederationTypeScriptHost, NativeFederationTypeScriptRemote} from 'native-federation-typescript/esbuild'
build({
plugins: [
NativeFederationTypeScriptRemote({ /* options */ }),
NativeFederationTypeScriptHost({ /* options */ })
],
})
Rspack
// rspack.config.js
const {NativeFederationTypeScriptHost, NativeFederationTypeScriptRemote} = require('native-federation-typescript/rspack')
module.exports = {
/* ... */
plugins: [
NativeFederationTypeScriptRemote({ /* options */ }),
NativeFederationTypeScriptHost({ /* options */ })
]
}
To have the type definitions automatically found for imports, add paths to the compilerOptions
in the tsconfig.json
:
{
"paths": {
"*": ["./@mf-types/*"]
}
}
To use it in a host
module, refer to this example.
To use it in a remote
module, refer to this example.