javascript - 纱线:$未定义
问题描述
我第一次使用 Yarn。我已经安装了最新版本的 Laravel Boilerplate ( http://laravel-boilerplate.com/ ) 并且使用了 Yarn。
我需要包含 JS 库 DataTables ( https://datatables.net/ )。不幸的是,我是 Yarn 的新手,我不确定我是否做对了一切,因为我得到了错误:
[显示/隐藏消息详细信息。] ReferenceError: $ is not defined
这是在这条线上:
$(document).ready(function() {
...
这告诉我它找不到 jquery 库,但它应该在那里。
这是 webpack.mix.js 代码:
const 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.setPublicPath('public');
mix.sass('resources/sass/frontend/app.scss', 'css/frontend/frontend.css')
.sass('resources/sass/backend/app.scss', 'css/backend/backend.css')
.js('resources/js/frontend/app.js', 'js/frontend/frontend.js')
.js([
'resources/js/backend/before.js',
'resources/js/backend/app.js',
'resources/js/backend/after.js'
], 'js/backend/backend.js')
.extract([
'jquery',
'datatables.net-dt',
'bootstrap',
'popper.js/dist/umd/popper',
'axios',
'sweetalert2',
'lodash',
'@fortawesome/fontawesome-svg-core',
'@fortawesome/free-brands-svg-icons',
'@fortawesome/free-regular-svg-icons',
'@fortawesome/free-solid-svg-icons'
]);
if (mix.inProduction() || process.env.npm_lifecycle_event !== 'hot') {
mix.version();
}
每次我调用命令“yarn prod”以创建 CSS 和 js 文件时,但 DataTables 不工作。
我错过了什么?
提前致谢!
解决方案
不是因为yarn
。Yarn 是一个包管理器,它不运行应用程序代码的任何部分,因此不会产生像你这样的错误。Yarn 仅用于下载包和管理它们的依赖项。
然后来找Laravel Mix
你,这只是Webpack
. Webpack 读取您的应用程序代码,处理您的文件中的require
和import
命令.js
,然后生成您的包。
如何使其工作:
我想您在yarn
安装 Laravel Boilerplate 时确实在项目根目录中运行了该命令(不带参数)。您的目录中应该有很多包node_modules
(超过 900 个)。
然后你也跑了yarn add -D datatables.net-dt
。现在你应该在里面有一个datatables.net
和一个datatables.net-dt
文件夹node_modules
。
我看到你已经datatables.net-dt
在你的中添加了webpack.mix.js
,这没关系!如文档中所述,您不需要任何其他内容。require( 'datatables.net-dt' )( window, $ );
你的那一行webpack.mix.js
就够了!DataTable
将在您的vendor.js
.
现在创建一个带有属性的示例表,然后将此代码添加到您的底部:id="example"
index.blade.php
resources\js\frontend\app.js
$(document).ready(function() {
$('#example').DataTable();
});
然后运行yarn dev
让 Webpack 生成你的包(编译好的 js 文件)并在浏览器中查看你的站点。在这些之后,它应该正在全新安装 Laravel Boilerplate,没有任何错误。我现在刚刚测试了 id ,就像魅力一样。
您可能的错误:
$ is not defined
jQuery
告诉您的代码的某些部分在加载之前正在尝试使用。
重要的是,您必须在您的内部或单独使用jQuery
(缩短$
)编写代码,稍后需要/导入到此文件中!这是因为和其他供应商软件包一样存储在 中,必须在调用它们之前加载它们。resources\js\frontend\app.js
.js
jQuery
DataTable
vendor.js
所以不要在你的应用代码的标签中使用自定义<script>
标签,因为它会在你的标签底部定义的任何其他代码之前加载和执行!html
<head>
<body>
看看这个文件resources\views\frontend\layouts\app.blade.php
。在body
标签的底部,您会看到:
<!-- Scripts -->
@stack('before-scripts')
{!! script(mix('js/manifest.js')) !!}
{!! script(mix('js/vendor.js')) !!}
{!! script(mix('js/frontend.js')) !!}
@stack('after-scripts')
您resources\js\frontend\app.js
及其所有导入的脚本都将编译到该js/frontend.js
文件中。
Laravel Boilerplate 中如何导入 jQuery:
这在默认情况下做得很好,你不必费心。打开你的resources\js\bootstrap.js
,看到这两行:
import $ from 'jquery';
window.$ = window.jQuery = $;
该文件随后将由frontend/app.js
. 所以在这里写你的代码,你会没事的......
PS.:如果这不能帮助您使其工作,您应该编辑您的问题并提供有关您的来源的更多信息。例如从您的 Chrome DevTools 截取的屏幕截图,显示了发生错误的 JavaScript 行。
推荐阅读
- angular - Ngrx 如何在 OnPush 策略中触发 Angular 的 Change Detection
- python - 将数组元素输入递归函数时出错
- git - --skip-worktree 不会让我更改分支
- xml - Schematron 快速修复问题
- python - ImportError: No module with Popen subprocess other file in the same folder from terminal/cron
- ballerina - Ballerina V 1.0 - 从文件中获取配置值
- bash - bash 试图将变量传递给 curl 命令
- reactjs - 如何在网格列中显示数据
- asp.net - 如何从 dotnet core 3.0 中的 HttpContext.Request 获取 applicationPath
- python - teradatasql Python 模块仅在编写脚本时有效,但在运行代码时无效