{"id":17750612,"url":"https://github.com/nuintun/rspack-dev-middleware","last_synced_at":"2025-08-01T08:38:01.854Z","repository":{"id":255336175,"uuid":"848675892","full_name":"nuintun/rspack-dev-middleware","owner":"nuintun","description":"A koa 2 middleware for rspack development and hot reloading.","archived":false,"fork":false,"pushed_at":"2025-07-11T01:31:32.000Z","size":17225,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-07-11T06:33:32.137Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nuintun.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-08-28T07:41:41.000Z","updated_at":"2025-07-11T01:31:35.000Z","dependencies_parsed_at":"2024-09-18T06:15:33.610Z","dependency_job_id":"fa7c3142-4b6f-4697-8d8e-76efa28042b3","html_url":"https://github.com/nuintun/rspack-dev-middleware","commit_stats":null,"previous_names":["nuintun/rspack-dev-middleware"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/nuintun/rspack-dev-middleware","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nuintun%2Frspack-dev-middleware","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nuintun%2Frspack-dev-middleware/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nuintun%2Frspack-dev-middleware/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nuintun%2Frspack-dev-middleware/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nuintun","download_url":"https://codeload.github.com/nuintun/rspack-dev-middleware/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nuintun%2Frspack-dev-middleware/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266592265,"owners_count":23953109,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-22T02:00:09.085Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-26T12:22:52.411Z","updated_at":"2025-07-23T00:07:37.312Z","avatar_url":"https://github.com/nuintun.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# rspack-dev-middleware\n\n\u003c!-- prettier-ignore --\u003e\n\u003e A koa 2 middleware for rspack development and hot reloading.\n\u003e\n\u003e [![NPM Version][npm-image]][npm-url]\n\u003e [![Download Status][download-image]][npm-url]\n\u003e [![Languages Status][languages-image]][github-url]\n\u003e [![Tree Shakeable][tree-shakeable-image]][bundle-phobia-url]\n\u003e [![Side Effect][side-effect-image]][bundle-phobia-url]\n\u003e [![License][license-image]][license-url]\n\n### Usage\n\n```ts\n/**\n * @module rspack\n * @description Rspack config.\n */\n\nimport Koa from 'koa';\nimport memfs from 'memfs';\nimport path from 'node:path';\nimport rspack from '@rspack/core';\nimport compress from 'koa-compress';\nimport { server as dev } from 'rspack-dev-middleware';\nimport ReactRefreshPlugin from '@rspack/plugin-react-refresh';\n\nconst entryHTML = path.resolve('wwwroot/index.html');\n\nfunction createMemfs() {\n  const volume = new memfs.Volume();\n  const fs = memfs.createFsFromVolume(volume);\n\n  return fs;\n}\n\nfunction httpError(error) {\n  return /^(EOF|EPIPE|ECANCELED|ECONNRESET|ECONNABORTED)$/i.test(error.code);\n}\n\nconst html = {\n  minify: true,\n  title: 'Rspack',\n  filename: entryHTML,\n  templateParameters: { lang: 'en' },\n  template: path.resolve('index.ejs'),\n  favicon: path.resolve('src/images/favicon.png'),\n  meta: { 'theme-color': '#4285f4', viewport: 'width=device-width,initial-scale=1.0' }\n};\n\nconst compiler = rspack({\n  name: 'React',\n  mode: 'development',\n  context: path.resolve('src'),\n  entry: path.resolve('src/index.tsx'),\n  output: {\n    publicPath: '/public/',\n    filename: `js/[name].js`,\n    chunkFilename: `js/[name].js`,\n    path: path.resolve('wwwroot/public'),\n    assetModuleFilename: `[path][name][ext]`\n  },\n  experiments: {\n    css: true\n  },\n  watchOptions: {\n    aggregateTimeout: 256\n  },\n  stats: {\n    colors: true,\n    chunks: false,\n    children: false,\n    entrypoints: false,\n    runtimeModules: false,\n    dependentModules: false\n  },\n  devtool: 'eval-cheap-module-source-map',\n  resolve: {\n    fallback: { url: false },\n    extensions: ['.ts', '.tsx', '.js', '.jsx']\n  },\n  module: {\n    parser: {\n      'css/auto': {\n        namedExports: true\n      }\n    },\n    generator: {\n      'css/auto': {\n        localIdentName: '[local]-[hash:8]',\n        exportsConvention: 'camel-case-only'\n      }\n    },\n    rules: [\n      {\n        test: /\\.[jt]sx?$/i,\n        type: 'javascript/auto',\n        loader: 'builtin:swc-loader',\n        exclude: /[\\\\/]node_modules[\\\\/]/,\n        options: {\n          jsc: {\n            externalHelpers: true,\n            parser: {\n              tsx: true,\n              syntax: 'typescript'\n            },\n            transform: {\n              react: {\n                refresh: true,\n                runtime: 'automatic'\n              }\n            }\n          },\n          env: {\n            targets: ['defaults', 'not IE \u003e= 0']\n          }\n        }\n      },\n      {\n        test: /\\.css$/i,\n        type: 'css/auto',\n        exclude: /[\\\\/]node_modules[\\\\/]/\n      },\n      {\n        type: 'asset/resource',\n        test: /\\.(cur|svg|png|mp4)$/i,\n        exclude: /[\\\\/]node_modules[\\\\/]/\n      }\n    ]\n  },\n  plugins: [\n    new ReactRefreshPlugin(),\n    new rspack.ProgressPlugin({\n      prefix: '[Rspack]',\n      progressChars: '█▒'\n    }),\n    new rspack.HtmlRspackPlugin(html)\n  ]\n});\n\nconst port = 8000;\nconst app = new Koa();\nconst fs = createMemfs();\nconst server = dev(compiler, {\n  fs,\n  headers: {\n    'Cache-Control': 'no-cache',\n    'X-Content-Type-Options': 'nosniff'\n  }\n});\n\napp.use(\n  compress({\n    br: false\n  })\n);\n\napp.use(server);\n\napp.use(async ctx =\u003e {\n  ctx.type = 'text/html; charset=utf-8';\n  ctx.body = fs.createReadStream(entryHTML);\n});\n\napp.on('error', error =\u003e {\n  !httpError(error) \u0026\u0026 console.error(error);\n});\n\napp.listen(port, () =\u003e {\n  server.ready(() =\u003e {\n    server.logger.info(`server run at: \\u001B[36mhttp://127.0.0.1:${port}\\u001B[0m`);\n  });\n});\n```\n\n### Screenshot\n\n![Screenshot](https://raw.githubusercontent.com/nuintun/rspack-dev-middleware/main/screenshot.png)\n\n[npm-image]: https://img.shields.io/npm/v/rspack-dev-middleware?style=flat-square\n[npm-url]: https://www.npmjs.org/package/rspack-dev-middleware\n[download-image]: https://img.shields.io/npm/dm/rspack-dev-middleware?style=flat-square\n[languages-image]: https://img.shields.io/github/languages/top/nuintun/rspack-dev-middleware?style=flat-square\n[github-url]: https://github.com/nuintun/rspack-dev-middleware\n[tree-shakeable-image]: https://img.shields.io/badge/tree--shakeable-true-brightred?style=flat-square\n[side-effect-image]: https://img.shields.io/badge/side--effect-true-yellow?style=flat-square\n[bundle-phobia-url]: https://bundlephobia.com/result?p=rspack-dev-middleware\n[license-image]: https://img.shields.io/github/license/nuintun/rspack-dev-middleware?style=flat-square\n[license-url]: https://github.com/nuintun/rspack-dev-middleware/blob/main/LICENSE\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnuintun%2Frspack-dev-middleware","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnuintun%2Frspack-dev-middleware","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnuintun%2Frspack-dev-middleware/lists"}