【问题标题】:Laravel Mix and NPM jQuery is Autoloaded But Is UndefinedLaravel Mix 和 NPM jQuery 已自动加载但未定义
【发布时间】:2019-02-20 18:03:44
【问题描述】:

所以我做了以下这些似乎解决了很多让 jQuery 和 Laravel Mix (4.0) 绊倒人们的问题:

.autoload({
    'jquery': ['$', 'window.jQuery', 'jQuery'],
    'clipboard': ['ClipboardJS'],
    'popper.js':  ['Popper']
});

这让我不再收到$ is not defined 错误。

但是现在,如果我在控制台登录 $jQuerywindow.jQuery,它不再是 is not defined 而是 undefined

我该如何解决这个问题?变量已正确附加到窗口,但它们是空的...

我认为我的模块加载错误,或者对package.jsonwebpack.mix.js 的交互方式有些困惑。每个文件的完整文件如下:

package.json:

{
    "private": true,
    "scripts": {
        "dev": "npm run development",
        "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "watch": "npm run development -- --watch",
        "watch-poll": "npm run watch -- --watch-poll",
        "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
        "prod": "npm run production",
        "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
    },
    "devDependencies": {},
    "dependencies": {
        "@fortawesome/fontawesome-free": "^5.6.3",
        "bootstrap": "^4.2.1",
        "bootstrap-datepicker": "^1.8.0",
        "clipboard": "^2.0.4",
        "inputmask": "^4.0.6",
        "jquery": "^3.2",
        "jquery-editable-select": "^2.2.5",
        "jquery-lazy": "^1.7.10",
        "laravel-mix": "4.0",
        "popper.js": "^1.12.9"
    }
}

webpack.mix.js:

    mix
  .js([



    /*
    |--------------------------------------------------------------------------
    | Modules
    |--------------------------------------------------------------------------
    */
    'node_modules/jquery/dist/jquery.min.js',
    'node_modules/popper.js/dist/umd/popper.min.js',
    'node_modules/bootstrap/dist/js/bootstrap.min.js',
    'node_modules/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js',
    'node_modules/jquery-lazy/jquery.lazy.min.js',
    'node_modules/jquery-lazy/jquery.lazy.plugins.js',
    'resources/modules/jRange/jquery.range-min.js',
    'node_modules/inputmask/dist/jquery.inputmask.bundle.js',
    'node_modules/clipboard/dist/clipboard.min.js',
    'resources/js/app.js'
  ], 'public/js/app.js')
  .autoload({
    'jquery': ['$', 'window.jQuery', 'jQuery'],
    'clipboard': ['ClipboardJS'],
    'popper.js': ['Popper']
  });

如果您有任何建议,请告诉我。我尝试了npm run devnpm run production 并得到相同的错误undefined 输出。

【问题讨论】:

  • 只是为了确定,你的 bootstrap.js 是什么样的? Laravel 和 Webpack 是什么版本的?

标签: jquery laravel laravel-mix


【解决方案1】:

所以,使用开箱即用的 mix 来获取 jQuery,我这样做了:

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

/*
 |--------------------------------------------------------------------------
 | Mix Asset Management
 |--------------------------------------------------------------------------
 |
 | Mix provides a clean, fluent API for defining some Webpack build steps
 | for your Laravel application. By default, we are compiling the Sass
 | file for the application as well as bundling up all the JS files.
 |
 */

mix.js('resources/assets/js/app.js', 'public/js')
   .sass('resources/assets/sass/app.scss', 'public/css')
   .version();

然后在resources/assets/js/bootstrap.js中:

try {
    window.$ = window.jQuery = require('jquery');

    require('bootstrap');
} catch (e) {}

Webpack 完成其他所有工作。

而且,是的,npm 正在安装 jQuery,因为这是我的 package.json:

{
    "private": true,
    "scripts": {
        "dev": "npm run development",
        "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "watch-poll": "npm run watch -- --watch-poll",
        "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
        "prod": "npm run production",
        "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
    },
    "devDependencies": {
        "axios": "^0.16.2",
        "bootstrap": "^4.1",
        "cross-env": "^5.1.4",
        "jquery": "^3.3.1",
        "laravel-mix": "^1.7.2",
        "lodash": "^4.17.5",
        "vue": "^2.5.16"
    },
    "dependencies": {
        "@fortawesome/fontawesome": "^1.1.5",
        "@fortawesome/fontawesome-free-webfonts": "^1.0.9",
        "ar.js": "^1.4.10",
        "chess.js": "^0.10.2",
        "chessboardjs": "0.0.1",
        "font-awesome": "^4.7.0",
        "laravel-echo": "^1.4.0",
        "popper.js": "^1.14.3",
        "socket.io-client": "^2.1.1",
        "typeface-raleway": "0.0.54"
    }
}

【讨论】:

  • 在将 jquery 绑定到 bootstrap.js 文件中的窗口对象之前,我只需要 import "bootstrap" 就可以了。
猜你喜欢
  • 1970-01-01
  • 2018-07-26
  • 2018-11-09
  • 2020-08-28
  • 2017-08-23
  • 2014-01-18
  • 2019-05-30
  • 1970-01-01
  • 2018-03-20
相关资源
最近更新 更多