You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在CodeIgniter中集成Material UI InputLabel遇语法错误求助

解决CodeIgniter集成Material UI表单时的「Invalid token」和「Unexpected Token }」错误

看起来你刚接触React和npm,在集成过程中踩了模块系统混用的坑——这是新手很容易遇到的问题,我来帮你一步步理清并解决:

问题根源

你现在同时混用了三种模块加载方式:

  1. 本地npm安装的ES模块(用import语法)
  2. CDN引入的UMD全局模块
  3. 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组件,建议用这种方式,更规范:

  1. 在CodeIgniter项目根目录初始化npm:
    npm init -y
    
  2. 安装依赖:
    npm install react react-dom @material-ui/core
    
  3. 安装打包工具(比如webpack)和相关loader:
    npm install webpack webpack-cli babel-loader @babel/core @babel/preset-react --save-dev
    
  4. 配置webpack(新建webpack.config.js),把你的React代码打包成浏览器能识别的bundle.js
  5. 编写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>
      );
    }
    
  6. 打包后,在main.php里只引入打包好的bundle.js即可,删掉所有CDN和require.js

额外提醒

  • 「Invalid token」大多是因为模块路径错误或加载失败,比如你之前的import路径在浏览器里无法访问到node_modules里的文件
  • 「Unexpected Token }」通常是语法错误,比如括号不匹配,或者浏览器不认识import语法(普通script不支持ES模块)

内容的提问来源于stack exchange,提问作者nkumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:25:42