You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Vue组件集成报错:require is not defined问题求助

解决"Require is not defined"错误:Vue单文件组件集成指南

Hey 哥们,我一眼就看出你这问题的根源了——浏览器原生不支持Node.js的CommonJS模块语法(require(),也没法直接解析ES6的import/export,更别说.vue这种单文件组件了!之前你的Vue代码能正常运行,大概率是直接用CDN引入Vue写的全局代码,没涉及模块化开发,但现在用上了单文件组件和第三方依赖,这些模块化语法必须通过打包工具转译才能被浏览器识别。

下面给你几种针对性的解决方案,根据你的项目场景选就行:

方案1:用Vue CLI一键搞定(推荐新项目/重构场景)

如果你的项目还处于初期,或者可以重构,直接用Vue CLI初始化项目,它会自动配置好Webpack打包环境,省超多事:

  1. 先全局安装Vue CLI:
    npm install -g @vue/cli
    
  2. 创建新项目:
    vue create my-vue-chart-project
    
  3. 把你的App.vue代码迁移到新项目的src/App.vue里,然后安装依赖:
    npm install vue-fusioncharts fusioncharts
    
  4. 修改src/main.js(把插件注册逻辑放在这里更合理):
    import Vue from 'vue'
    import App from './App.vue'
    import VueFusionCharts from 'vue-fusioncharts'
    import FusionCharts from 'fusioncharts'
    import Column2D from 'fusioncharts/fusioncharts.charts'
    import FusionTheme from 'fusioncharts/themes/fusioncharts.theme.fusion'
    
    Vue.use(VueFusionCharts, FusionCharts, Column2D, FusionTheme)
    
    new Vue({
      render: h => h(App)
    }).$mount('#app')
    
  5. 打包生成生产环境代码:
    npm run build
    
  6. dist文件夹里的js/app.xxx.jscss/app.xxx.css引入到你的Blade模板里就行。

方案2:Laravel项目专属(用Laravel Mix)

看你用了Blade模板,大概率是Laravel项目!Laravel自带的Mix已经帮你配置好了基础的打包环境,只需要几步就能支持Vue单文件组件:

  1. 安装必要的依赖:
    npm install vue vue-fusioncharts fusioncharts
    npm install laravel-mix vue-loader vue-template-compiler --save-dev
    
  2. 修改webpack.mix.js,启用Vue单文件组件编译:
    const mix = require('laravel-mix');
    
    mix.js('resources/js/app.js', 'public/js')
       .vue(); // 加这一行就搞定Vue组件编译
    
  3. 把你的App.vue放到resources/js/components/目录下,然后修改resources/js/app.js
    import Vue from 'vue'
    import VueFusionCharts from 'vue-fusioncharts'
    import FusionCharts from 'fusioncharts'
    import Column2D from 'fusioncharts/fusioncharts.charts'
    import FusionTheme from 'fusioncharts/themes/fusioncharts.theme.fusion'
    import App from './components/App.vue'
    
    // 注册插件
    Vue.use(VueFusionCharts, FusionCharts, Column2D, FusionTheme)
    // 注册全局组件
    Vue.component('Chart', App)
    
    // 挂载Vue实例
    new Vue({
        el: '#app'
    })
    
  4. 运行打包命令(开发用dev,生产用prod):
    npm run dev
    
  5. 最后在Blade模板里引入打包后的JS:
    <div id="app">
      <Chart></Chart>
    </div>
    <script src="{{ asset('js/app.js') }}"></script>
    

临时调试方案(仅用于快速验证,不推荐生产)

要是你只想快速验证代码逻辑,不想折腾打包工具,可以改成CDN引入所有依赖,去掉模块化语法:

  1. 在Blade模板开头先引入所有CDN资源:
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/fusioncharts@3.20.0/dist/fusioncharts.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/fusioncharts@3.20.0/dist/fusioncharts.charts.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/fusioncharts@3.20.0/dist/themes/fusioncharts.theme.fusion.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue-fusioncharts@3.0.0/dist/vue-fusioncharts.js"></script>
    
  2. 把组件逻辑改成全局注册的方式,去掉import/exportrequire
    Vue.use(VueFusionCharts, FusionCharts, Column2D, FusionTheme)
    
    Vue.component('Chart', {
      template: `
        <div id="appp">
          <div id="chart-container"></div>
        </div>
      `,
      data() {
        return {}
      }
    })
    
    new Vue({
      el: '#app'
    })
    
  3. 把这段代码直接放到Blade的<script>标签里,或者单独存成JS文件引入,就能正常运行了。不过这种方式不利于项目维护,只适合临时测试哈。

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

火山引擎 最新活动