不用Vite、Webpack,React如何重返HTML时代反工程化?

摘要:前言 最近一直忙于装修和开发新产品,文章都没时间更新,快速迭代的后果就是架构没有跟上功能增长的步伐,现在隐隐有脱离掌控的感觉,我这几天也把进度放慢下来,思考一下整体的规划。 也顺便整理一下笔记,没有输出心里很不踏实&#129
前言 最近一直忙于装修和开发新产品,文章都没时间更新,快速迭代的后果就是架构没有跟上功能增长的步伐,现在隐隐有脱离掌控的感觉,我这几天也把进度放慢下来,思考一下整体的规划。 也顺便整理一下笔记,没有输出心里很不踏实🤣 好了,说回正题,为什么标题叫“前端邪修”呢?在前端高度工程化的今天,各种工具层出不穷,大家都在说别更新了,学不动了,我直接反其道而行: 不用 Vite 不用 Webpack 不跑 dev server 不搞 HMR 不维护 node_modules 直接在 HTML 文件里引入 React 写界面! 这听起来很像 2025 年还在用 Dreamweaver 写网页哈哈哈🤣 本文记录一次可以称之为「前端邪修」的反工程化开发实践。 第一阶段 Runtime JSX 一开始,我用的是最原始、也最“离经叛道”的 React 用法。 <script src="react.development.js"></script> <script src="react-dom.development.js"></script> <script src="babel.min.js"></script> <script type="text/babel"> function App() { return <h1>Hello World</h1>; } </script> 特点很明显: 不需要 Node 不需要 npm / pnpm 打开浏览器就能写 React JSX 由 babel-standalone 在浏览器里实时编译 你别说,其实这种方法写起来还挺爽的(逃 心智负担极低 没有工具链焦虑 HTML 即入口,所见即所得 但缺点也很明显: 各种依赖体积巨大,动辄几MB JSX runtime 编译极慢 页面一复杂,加载时间肉眼可见地上升 我这个简单的app,本地加载都要半分钟的时间🤣 其实这种用法,是 React 官方早期 Demo + 教学级用法,后来被官方明确标注为:Not recommended for production 我之前也写过一篇文章介绍:在HTML中引入React和JSX 实践也证明了,这种方式只能当本地demo测试一下,根本不能作为production发布。 第二阶段 gulp + babel,我只要 JSX 编译 我选择了一个在今天看来非常“复古”的工具:gulp。 这个工具虽然简单,但非常好用,我一直非常喜欢这个工具,可以在我的很多项目里看到 gulp 的身影: AspNetCore开发笔记:使用NPM和gulp管理前端静态文件 Django项目引入NPM和gulp管理前端资源 返璞归真!使用 Alpine.js 开发交互式 web 应用,抛弃 node_modules 和 webpack 吧! 用法是这样的: 把 jsx 组件按照顺序,显示添加到待处理的列表里 const jsxComponents = [ "Alert.jsx", "Toast.jsx", "Login.jsx", "Register.jsx", "ChatView.jsx", "DetailView.jsx", "App.jsx" ]; 我放弃了自动依赖分析,这在现代前端里几乎是“原罪”。😂 但在一个边界清晰、规模可控的项目里,它反而是最可控的方式。 gulp 在这里做了简单的几个事情: JSX → JS 多文件 → 一个 bundle 压缩 gulp.task("concat:jsx", () => { return gulp.src(jsxComponents, { base: "." }) .pipe(babel({ presets: ["@babel/preset-env", "@babel/preset-react"] })) .pipe(concat("dist/js/app.bundle.js")) .pipe(terser()) // Use terser for minification .pipe(gulp.dest(paths.root)); }); 没有 loader,没有 plugin 地狱,没有配置互相打架。 最终产物只有一个:dist/js/app.bundle.js 最终形态 构建完成后,整个应用的入口是一个极其朴素的 HTML 文件。
阅读全文