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

Vue+Laravel项目执行npm run production后self变量变为undefined如何解决

根本原因

Laravel Mix底层依赖Webpack进行代码打包,按照ES模块化规范要求,ES模块的顶层this默认等于undefined,而非浏览器全局对象window。生产模式构建时,压缩工具会直接将你写的var self = this直接优化为var self = undefined,这就是你遇到的问题的核心诱因。

解决方案

你可以根据自己的开发习惯选择以下任意一种方案:

方案1:直接指向全局对象(改动最小)

直接把两个js文件里的var self = this替换为var self = window即可,生产构建时不会被替换,符合浏览器运行环境的预期。

方案2:遵循模块化规范改写(推荐)

放弃手动挂载方法到this的写法,直接用JS模块的原生导出导入语法:

  1. 修改assets/js/homepage/component/homepage.js的导出逻辑:
// 删掉var self = this这行,直接导出start方法
export function start() {
    if(!_isInit) {
        _homepage();
    }
}
  1. 修改上层assets/js/homepage/homepage.js的导入逻辑:
// 删掉var self = this这行,直接导入方法
import { start as componentStart } from './components/homepage';

// 导出当前模块的start方法
export function start() {
    if(!_isInit) {
        console.log("Homepage starts..");
        componentStart();
    }
}

// 直接调用即可
start();

这种写法完全符合模块化规范,后续维护性也更好。

方案3:修改Webpack配置关闭规则

如果不想改动原有业务代码,可以在Laravel Mix配置中添加规则,强制把顶层this替换为window:

const mix = require('laravel-mix');

mix.webpackConfig({
    module: {
        rules: [
            {
                test: /\.js$/,
                parser: {
                    topLevelThis: 'window'
                }
            }
        ]
    }
})
.js('resources/js/app.js', 'public/js')
.sass('resources/sass/app.scss', 'public/css')
.js('resources/assets/js/homepage/homepage.js', 'public/js/homepage');

配置修改后重新执行构建命令即可生效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:54:00