Laravel 5.4 脚本加载问题
Laravel 5.4 Script loading issue
我正在处理我的第一个 Laravel 项目 (5.4),实际上我不明白为什么我的 js 脚本不能像我预期的那样工作。
我使用 Mix 和 Blade :
// webpack.mix.js
let { mix } = require('laravel-mix').mix;
// copy fonts and patterns
mix .copy('resources/assets/vendor/bootstrap/fonts', 'public/fonts')
.copy('resources/assets/vendor/font-awesome/fonts', 'public/fonts')
.copy('resources/assets/patterns', 'public/css/patterns')
// compile scss and concatenate css files
.sass('resources/assets/sass/app.scss', 'public/css')
.styles([
'resources/assets/vendor/bootstrap/css/bootstrap.css',
'resources/assets/vendor/animate/animate.css'
// ...
], 'public/css/vendor.css')
// concatenate js files
.js([
'resources/assets/vendor/jquery/jquery-3.1.1.min.js',
'resources/assets/vendor/bootstrap/js/bootstrap.js',
'resources/assets/js/app.js'
// ...
], 'public/js/app.js')
.options({ processCssUrls: false }); // fix for path issue : https://github.com/almasaeed2010/AdminLTE/issues/1360
npm run dev
编译后看起来不错:
DONE Compiled successfully in 6497ms 4:20:57 PM
Asset Size Chunks Chunk Names
fonts/glyphicons-halflings-regular.ttf 45.4 kB [emitted]
/js/app.js 1.2 MB 0 [emitted] [big] /js/app
mix-manifest.json 66 bytes [emitted]
fonts/glyphicons-halflings-regular.eot 20.1 kB [emitted]
fonts/glyphicons-halflings-regular.woff2 18 kB [emitted]
fonts/glyphicons-halflings-regular.svg 109 kB [emitted]
fonts/glyphicons-halflings-regular.woff 23.4 kB [emitted]
/css/app.css 178 kB 0 [emitted] /js/app
fonts/fontawesome-webfont.ttf 166 kB [emitted]
fonts/fontawesome-webfont.svg 444 kB [emitted] [big]
fonts/fontawesome-webfont.eot 166 kB [emitted]
fonts/fontawesome-webfont.woff 98 kB [emitted]
fonts/fontawesome-webfont.woff2 77.2 kB [emitted]
fonts/FontAwesome.otf 135 kB [emitted]
css/patterns/header-profile.png 5.88 kB [emitted]
CSS 工作正常,bootstrap.js 也工作,当我检查内部时 /js/app.js
似乎所有东西都在里面。
这是我的模板:
{{-- app.blade.php--}}
<!DOCTYPE html>
<html lang="{{ config('app.locale', 'en') }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@yield('title')</title>
<link rel="stylesheet" href="{!! asset('css/vendor.css') !!}" />
<link rel="stylesheet" href="{!! asset('css/app.css') !!}" />
</head>
<body>
<!-- Main view -->
@yield('content')
<script src="{!! asset('js/app.js') !!}" type="text/javascript"></script>
@section('scripts')
@show
</body>
</html>
当我想在 child.
的脚本部分中添加脚本时,我的麻烦就开始了
@extends('layouts.app')
@section('scripts')
<script type="text/javascript">
$(document).ready(function () {
alert('test');
});
</script>
@endsection
如果 jquery 没有加载,我得到了 Uncaught ReferenceError: $ is not defined
。
我不知道为什么,知道吗?
[注]
如果我在 app.blade.php :
<script src="{!! asset('js/app.js') !!}" type="text/javascript"></script>
与 :
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
我遇到了类似的问题,问题是在我第一次使用jQuery的时候,webpack生成的app.js
文件还没有加载。
您可以做一个简单的测试,看看您是否有同样的问题。在您使用 jQuery 的第一段代码中(抛出 $ 错误的代码行),将该代码包装在此:
document.addEventListener("DOMContentLoaded", function(event) {
// Your jQuery code
});
一种解决方法是在 blade 主布局文件中更早地加载 app.js
,但我相信可以通过更好的方式完成。我是 Laravel 的新手,所以我仍在弄清楚这些事情...
编辑:
好的,我想我现在明白了如何正确地做到这一点:
- 在你的主要 blade 布局中(在我的例子中是
app.blade.php
),在 </body>
标签之前的右下角,加载你的 webpack 脚本,你可能加载的所有其他外部脚本, 最后添加一个 yield scripts 部分。
示例:
<script src="/js/app.js"></script>
<script src="other/scripts/that/you/need.js"></script>
@yield('scripts')
- 在需要 jQuery 代码的 blade 模板中,您可以创建一个名为 scripts 的新部分,而不是直接将其添加到内容部分.
示例:
@section('content')
//Your view code
@endsection
@section('scripts')
//Your jQuery code
@endsection
这样,您的 jQuery 代码会在主布局已经加载 webpack javascript 文件(加载 jQuery)之后加载。
我终于知道谁是罪魁祸首了:Mix(或者我使用 Mix 的方式)
我错误地认为mix.js
和mix.scripts
是同一个函数。但是 mix.scripts
仅合并和缩小文件,而 mix.js
还编译 ECMAScript 2015 和模块捆绑。我真的不知道为什么,但这对我来说是个问题。
mix.js(['public/js/admin.js',
'public/js/dashboard.js'], 'public/js');
替换为:
mix.scripts(['public/js/admin.js',
'public/js/dashboard.js'], 'public/js/all.js');
查看更多:Laravel doc
只需在 blade 文件中包含如下所示的 js 文件,就我而言,我包含 add-section.js,它位于 public/js
中
<script src="{{ asset('/js/add-section.js') }}"></script>
@yield('scripts')
我正在处理我的第一个 Laravel 项目 (5.4),实际上我不明白为什么我的 js 脚本不能像我预期的那样工作。 我使用 Mix 和 Blade :
// webpack.mix.js
let { mix } = require('laravel-mix').mix;
// copy fonts and patterns
mix .copy('resources/assets/vendor/bootstrap/fonts', 'public/fonts')
.copy('resources/assets/vendor/font-awesome/fonts', 'public/fonts')
.copy('resources/assets/patterns', 'public/css/patterns')
// compile scss and concatenate css files
.sass('resources/assets/sass/app.scss', 'public/css')
.styles([
'resources/assets/vendor/bootstrap/css/bootstrap.css',
'resources/assets/vendor/animate/animate.css'
// ...
], 'public/css/vendor.css')
// concatenate js files
.js([
'resources/assets/vendor/jquery/jquery-3.1.1.min.js',
'resources/assets/vendor/bootstrap/js/bootstrap.js',
'resources/assets/js/app.js'
// ...
], 'public/js/app.js')
.options({ processCssUrls: false }); // fix for path issue : https://github.com/almasaeed2010/AdminLTE/issues/1360
npm run dev
编译后看起来不错:
DONE Compiled successfully in 6497ms 4:20:57 PM
Asset Size Chunks Chunk Names
fonts/glyphicons-halflings-regular.ttf 45.4 kB [emitted]
/js/app.js 1.2 MB 0 [emitted] [big] /js/app
mix-manifest.json 66 bytes [emitted]
fonts/glyphicons-halflings-regular.eot 20.1 kB [emitted]
fonts/glyphicons-halflings-regular.woff2 18 kB [emitted]
fonts/glyphicons-halflings-regular.svg 109 kB [emitted]
fonts/glyphicons-halflings-regular.woff 23.4 kB [emitted]
/css/app.css 178 kB 0 [emitted] /js/app
fonts/fontawesome-webfont.ttf 166 kB [emitted]
fonts/fontawesome-webfont.svg 444 kB [emitted] [big]
fonts/fontawesome-webfont.eot 166 kB [emitted]
fonts/fontawesome-webfont.woff 98 kB [emitted]
fonts/fontawesome-webfont.woff2 77.2 kB [emitted]
fonts/FontAwesome.otf 135 kB [emitted]
css/patterns/header-profile.png 5.88 kB [emitted]
CSS 工作正常,bootstrap.js 也工作,当我检查内部时 /js/app.js
似乎所有东西都在里面。
这是我的模板:
{{-- app.blade.php--}}
<!DOCTYPE html>
<html lang="{{ config('app.locale', 'en') }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@yield('title')</title>
<link rel="stylesheet" href="{!! asset('css/vendor.css') !!}" />
<link rel="stylesheet" href="{!! asset('css/app.css') !!}" />
</head>
<body>
<!-- Main view -->
@yield('content')
<script src="{!! asset('js/app.js') !!}" type="text/javascript"></script>
@section('scripts')
@show
</body>
</html>
当我想在 child.
的脚本部分中添加脚本时,我的麻烦就开始了@extends('layouts.app')
@section('scripts')
<script type="text/javascript">
$(document).ready(function () {
alert('test');
});
</script>
@endsection
如果 jquery 没有加载,我得到了 Uncaught ReferenceError: $ is not defined
。
我不知道为什么,知道吗?
[注]
如果我在 app.blade.php :
<script src="{!! asset('js/app.js') !!}" type="text/javascript"></script>
与 :
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
我遇到了类似的问题,问题是在我第一次使用jQuery的时候,webpack生成的app.js
文件还没有加载。
您可以做一个简单的测试,看看您是否有同样的问题。在您使用 jQuery 的第一段代码中(抛出 $ 错误的代码行),将该代码包装在此:
document.addEventListener("DOMContentLoaded", function(event) {
// Your jQuery code
});
一种解决方法是在 blade 主布局文件中更早地加载 app.js
,但我相信可以通过更好的方式完成。我是 Laravel 的新手,所以我仍在弄清楚这些事情...
编辑:
好的,我想我现在明白了如何正确地做到这一点:
- 在你的主要 blade 布局中(在我的例子中是
app.blade.php
),在</body>
标签之前的右下角,加载你的 webpack 脚本,你可能加载的所有其他外部脚本, 最后添加一个 yield scripts 部分。
示例:
<script src="/js/app.js"></script>
<script src="other/scripts/that/you/need.js"></script>
@yield('scripts')
- 在需要 jQuery 代码的 blade 模板中,您可以创建一个名为 scripts 的新部分,而不是直接将其添加到内容部分.
示例:
@section('content')
//Your view code
@endsection
@section('scripts')
//Your jQuery code
@endsection
这样,您的 jQuery 代码会在主布局已经加载 webpack javascript 文件(加载 jQuery)之后加载。
我终于知道谁是罪魁祸首了:Mix(或者我使用 Mix 的方式)
我错误地认为mix.js
和mix.scripts
是同一个函数。但是 mix.scripts
仅合并和缩小文件,而 mix.js
还编译 ECMAScript 2015 和模块捆绑。我真的不知道为什么,但这对我来说是个问题。
mix.js(['public/js/admin.js',
'public/js/dashboard.js'], 'public/js');
替换为:
mix.scripts(['public/js/admin.js',
'public/js/dashboard.js'], 'public/js/all.js');
查看更多:Laravel doc
只需在 blade 文件中包含如下所示的 js 文件,就我而言,我包含 add-section.js,它位于 public/js
中<script src="{{ asset('/js/add-section.js') }}"></script>
@yield('scripts')