Webpack integration
For raw webpack setups (CRA, Rspack, custom configs).
// webpack.config.js
const { TracelessStyleWebpackPlugin } = require("traceless-style/webpack");
module.exports = {
module: {
rules: [
{
test: /\.(ts|tsx|js|jsx)$/,
exclude: [/node_modules/, /\.traceless-style/],
use: [{ loader: require.resolve("traceless-style/webpack") }],
},
],
},
plugins: [
new TracelessStyleWebpackPlugin(),
],
};
What this does:
- Loader transforms
tl.create(...)/tl.extend(...)per file. - Plugin runs full extraction on
beforeCompile, injects__TRACELESS_STYLE_META__viaDefinePluginonthisCompilation, and re-emitspublic/traceless-style.cssonafterEmit.
Make sure to import the generated CSS yourself:
// src/index.tsx
import "../public/traceless-style.css";
Plugin options
new TracelessStyleWebpackPlugin({
srcDir: "src",
outCSS: "public/traceless-style.css",
dev: process.env.NODE_ENV !== "production",
});
| Option | Type | Default |
|---|---|---|
srcDir | string | string[] | "src" |
outCSS | string | "public/traceless-style.css" |
dev | boolean | process.env.NODE_ENV !== "production" |
Loader options
The loader has no required options. If you need to override srcDir or dev per-loader (rare), pass them via use[].options.
Why both a loader AND a plugin?
- The loader handles per-file
tl.createrewrites — fast, runs in webpack's per-file pipeline. - The plugin handles cross-file concerns: full extraction (Pass 0/1/2 across the whole srcDir),
__TRACELESS_STYLE_META__injection, CSS file emission.
Both are needed for full functionality. Without the plugin, tl.merge falls back to set-deduplication.
See also
See also