rolldown.config.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { defineConfig } from 'rolldown';
  2. import path from "path";
  3. import dotenv from 'dotenv';
  4. // 加载 .env 文件
  5. const define = {
  6. 'process.env.NODE_ENV': '"production"'
  7. }
  8. const env = dotenv.config({ path: path.resolve('.env') }).parsed;
  9. for (const key in env) {
  10. define[`process.env.${key}`] = JSON.stringify(env[key]);
  11. }
  12. const env_production = dotenv.config({ path: path.resolve('.env.production') }).parsed;
  13. for (const key in env_production) {
  14. define[`process.env.${key}`] = JSON.stringify(env_production[key]);
  15. }
  16. console.log({define})
  17. const entryFile = 'src/index.ts';
  18. function injectRequireEvalShim() {
  19. const shimCode = `
  20. if (!globalThis.eval) {
  21. globalThis.eval = (code) => {
  22. console.log({code})
  23. const fn = new Function("import { createRequire } from 'module';\\nconst require = createRequire(import.meta.url);\\n" + code);
  24. return fn();
  25. };
  26. }
  27. `;
  28. return {
  29. name: 'inject-require-eval-shim',
  30. transform(code, id) {
  31. const entryFilePath = path.resolve(entryFile);
  32. if (id !== entryFilePath) {
  33. return null;
  34. }
  35. // 把 shim 代码注入入口文件最前面
  36. return {
  37. code: shimCode + '\n' + code,
  38. map: null,
  39. };
  40. },
  41. };
  42. }
  43. function injectCodeInBundlePlugin() {
  44. return {
  45. name: 'inject-code-in-bundle',
  46. generateBundle(options, bundle) {
  47. // 遍历所有生成的文件
  48. for (const [fileName, chunkOrAsset] of Object.entries(bundle)) {
  49. // 只处理 JS chunk(即打包后的代码文件)
  50. if (chunkOrAsset.type === 'chunk') {
  51. // 在代码开头注入代码
  52. const injectCode = `
  53. if (!globalThis.eval) {
  54. globalThis.eval = (code) => {
  55. console.log({code})
  56. const fn = new Function("import { createRequire } from 'module';\\nconst require = createRequire(import.meta.url);\\n" + code);
  57. return fn();
  58. };
  59. }
  60. `;
  61. // 修改代码内容
  62. chunkOrAsset.code = injectCode + chunkOrAsset.code;
  63. }
  64. }
  65. },
  66. };
  67. }
  68. export default defineConfig({
  69. input: entryFile,
  70. output: {
  71. format: 'esm',
  72. dir: 'dist',
  73. },
  74. platform: 'node',
  75. resolve: {
  76. tsconfigFilename: 'tsconfig.json'
  77. },
  78. define,
  79. plugins: [
  80. // injectRequireEvalShim()
  81. // injectCodeInBundlePlugin()
  82. ]
  83. });