VirtualUrlPlugin

Allow creating virtual modules of any type, such as .ts, .json, .css, etc. default is .js.

5.100.0+
const webpack = require("webpack");

new webpack.experiments.schemes.VirtualUrlPlugin({
  myModule: 'export const msg = "from virtual module"',
});

src/app.js

import { msg } from "virtual:myModule";

console.log(msg);

Basic Example

Create a virtual module that generates build information

const webpack = require("webpack");

new webpack.experiments.schemes.VirtualUrlPlugin({
  buildInfo: {
    source() {
      return `export const buildTime = ${Date.now()}`;
    },
    version: true,
  },
});

src/app.js

import { buildTime } from "virtual:buildInfo";

console.log(`App version: ${buildTime}`);

Use custom schema

const webpack = require("webpack");

new webpack.experiments.schemes.VirtualUrlPlugin(
  {
    myModule: 'export const msg = "from virtual module"',
  },
  "v",
);

src/app.js

import { msg } from "v:myModule";

console.log(msg);

Advanced Example

Create multiple virtual modules of different types

const webpack = require("webpack");

new webpack.experiments.schemes.VirtualUrlPlugin({
  myCssModule: {
    type: ".css",
    source: "body{background-color: powderblue;}",
  },
  myJsonModule: {
    type: ".json",
    source: '{"name": "virtual-url-plugin"}',
  },
});

src/app.js

import json from "virtual:myJsonModule";
import "virtual:myCssModule";

Virtualize the routing file

const path = require("node:path");
const webpack = require("webpack");

const watchDir = path.join(__dirname, "./src/routes");

new webpack.experiments.schemes.VirtualUrlPlugin({
  routes: {
    source(loaderContext) {
      // Use addContextDependency to monitor the addition or removal of subdirectories in watchDir to trigger the rebuilding of virtual modules.
      loaderContext.addContextDependency(watchDir);

      const files = fs.readdirSync(watchDir);
      return `
        export const routes = {
          ${files.map((key) => `${key.split(".")[0]}: () => import('./src/routes/${key}')`).join(",\n")}
        }
      `;
    },
  },
});

src/app.js

import { routes } from "virtual:routes";

Options

  • module.type (string): Content type of the virtual module.
  • module.source (string | ((loaderContext: import('webpack').LoaderContext<T>) => Promise<string> | string)): Factory function for generating the content of virtual module.

  • module.version(boolean | string | () => string): When a invalidate is triggered, the source function is called again if the value of the version is different from the previous one. If set to true it will always trigger.

  • schema (string): Customizable virtual module schema, default is virtual.

1 Contributor

xiaoxiaojx