在CodeIgniter中集成Material UI InputLabel遇语法错误求助
解决CodeIgniter集成Material UI表单时的「Invalid token」和「Unexpected Token }」错误
看起来你刚接触React和npm,在集成过程中踩了模块系统混用的坑——这是新手很容易遇到的问题,我来帮你一步步理清并解决:
问题根源
你现在同时混用了三种模块加载方式:
- 本地npm安装的ES模块(用
import语法) - CDN引入的UMD全局模块
- require.js的AMD模块
这种混搭会导致浏览器无法正确解析模块,进而抛出语法或加载错误。另外,普通的<script>标签默认不支持ES模块的import语法,这也是「Unexpected Token }」的常见原因。
解决方案(分两种场景,选一种即可)
方案一:完全用CDN快速实现(适合新手,无需配置npm)
这个方式不用折腾本地npm包,直接通过CDN引入所有依赖,简单快捷:
- 先删掉你本地安装的
@material-ui/core(没用,还会混淆),以及script.js里的import语句 - 在
main.php里按顺序引入React、ReactDOM和Material UI的CDN(Material UI依赖前两者,顺序不能错) - 直接通过全局变量
MaterialUI来使用组件,不需要import
示例代码(替换你现有脚本部分):
<!-- 先引入React和ReactDOM,Material UI依赖它们 --> <script src="https://unpkg.com/react@17/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <!-- 引入Material UI的UMD版本 --> <script src="https://unpkg.com/@material-ui/core@4.3.3/umd/material-ui.development.js"></script> <!-- 你的表单脚本,用全局变量编写 --> <script> // 从全局的MaterialUI对象中解构需要的组件 const { InputLabel, TextField, Button } = MaterialUI; // 定义你的表单组件 function SimpleForm() { return React.createElement('div', null, React.createElement(InputLabel, { htmlFor: "username" }, '用户名'), React.createElement(TextField, { id: "username", label: "请输入用户名", variant: "outlined", style: { margin: '10px 0' } }), React.createElement(Button, { variant: "contained", color: "primary" }, '提交') ); } // 把组件渲染到页面的容器中(确保页面上有这个容器) ReactDOM.render( React.createElement(SimpleForm), document.getElementById('form-container') ); </script>
如果想用更简洁的JSX语法,需要再加一个Babel的CDN来转译JSX:
<!-- 加在React CDN之后 --> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <!-- 把脚本类型改成text/babel --> <script type="text/babel"> const { InputLabel, TextField, Button } = MaterialUI; function SimpleForm() { return ( <div style={{ padding: '20px' }}> <InputLabel htmlFor="username">用户名</InputLabel> <TextField id="username" label="请输入用户名" variant="outlined" style={{ margin: '10px 0', width: '300px' }} /> <br /> <Button variant="contained" color="primary"> 提交 </Button> </div> ); } ReactDOM.render(<SimpleForm />, document.getElementById('form-container')); </script>
别忘了在页面上添加渲染容器:
<div id="form-container"></div>
方案二:用npm+打包工具(推荐长期项目)
如果你的项目后续会有更多React组件,建议用这种方式,更规范:
- 在CodeIgniter项目根目录初始化npm:
npm init -y - 安装依赖:
npm install react react-dom @material-ui/core - 安装打包工具(比如webpack)和相关loader:
npm install webpack webpack-cli babel-loader @babel/core @babel/preset-react --save-dev - 配置webpack(新建
webpack.config.js),把你的React代码打包成浏览器能识别的bundle.js - 编写React组件(比如
src/Form.js),用import语法引入组件:import React from 'react'; import { InputLabel, TextField, Button } from '@material-ui/core'; export default function SimpleForm() { return ( <div style={{ padding: '20px' }}> <InputLabel htmlFor="username">用户名</InputLabel> <TextField id="username" label="请输入用户名" variant="outlined" style={{ margin: '10px 0', width: '300px' }} /> <br /> <Button variant="contained" color="primary"> 提交 </Button> </div> ); } - 打包后,在
main.php里只引入打包好的bundle.js即可,删掉所有CDN和require.js
额外提醒
- 「Invalid token」大多是因为模块路径错误或加载失败,比如你之前的
import路径在浏览器里无法访问到node_modules里的文件 - 「Unexpected Token }」通常是语法错误,比如括号不匹配,或者浏览器不认识
import语法(普通script不支持ES模块)
内容的提问来源于stack exchange,提问作者nkumar
相关产品推荐
相关产品推荐

