【问题标题】:Laravel javascript in file doesn't work, but does work if included through CDN文件中的 Laravel javascript 不起作用,但如果通过 CDN 包含则可以
【发布时间】:2026-01-26 23:10:02
【问题描述】:

这行得通:

<script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/2.0.2/anime.min.js"></script>

<script type="text/javascript">
var textWrapper = document.querySelector('.ml6 .letters');
textWrapper.innerHTML = textWrapper.textContent.replace(/\S/g, "<span class='letter'>$&</span>");

anime.timeline({loop: false})
    .add({
    targets: '.ml6 .letter',
    translateY: ["1.1em", 0],
    translateZ: 0,
    duration: 750,
    delay: (el, i) => 50 * i
});
</script>

但是如果我在libraries.js 中包含来自CDN 的确切JS,如下所示,我会得到ReferenceError: Can't find variable: anime

<script src="{{ mix('/js/libraries.js') }}"></script>

<script type="text/javascript">
var textWrapper = document.querySelector('.ml6 .letters');
textWrapper.innerHTML = textWrapper.textContent.replace(/\S/g, "<span class='letter'>$&</span>");

anime.timeline({loop: false})
    .add({
    targets: '.ml6 .letter',
    translateY: ["1.1em", 0],
    translateZ: 0,
    duration: 750,
    delay: (el, i) => 50 * i
});
</script>

我检查并混合正在编译,JS包含在libraries.js中。

这是完全相同的脚本,包含在完全相同的位置,所以我很困惑为什么这不起作用。我唯一能想到的是libraries.js 是在脚本运行之后加载的。是这样吗?如果是这样:我该如何解决?

我经常遇到这个问题。我想使用mix() 而不是asset()。 以上大约是 1 个库,但我更愿意将我使用的大部分库包含在一个文件 libraries.js 中,但由于上述问题,今天我通过 CDN 加载其中大部分。

【问题讨论】:

  • 您是否尝试在文件顶部添加这些行? &lt;script src="{{ mix('/js/libraries.js') }}"&gt;&lt;/script&gt;
  • 我不想把这个文件移到我的&lt;head&gt; 如果你是这个意思吗?
  • 因为libraries.js 可能会在您的 js 代码加载后加载。所以这就是为什么这个问题仍然存在。检查您的控制台。
  • 控制台只显示ReferenceError: Can't find variable: anime。如果你说的是真的,那么我如何控制某些东西何时加载?因为现在它更像是一场赌博,所以很难控制加载的内容和时间。我刚刚更新了这个问题,即使我在同一文件中启动库 之后 库它仍然不起作用。
  • 就像测试一样,您可以在代码中从libraries.js 复制代码并尝试其是否有效。

标签: javascript laravel laravel-mix


【解决方案1】:

尝试用 :

包装你的内联 js
window.addEventListener('load', function(){ // here });

【讨论】:

    【解决方案2】:

    我假设你有一个文件 resources/js/libraries.js 和一堆 require(); 来导入 npm 包和另一个 JS 文件来导入自定义代码?好吧,我想提出一些建议:

    你不必为它们制作单独的 JS 文件,webpack 可以像这样自动提取它们:

    mix.js('resources/js/app.js', 'public/js')
        .sass('resources/sass/app.scss', 'public/css')
        .extract([
            'bootstrap', 
            'popper.js',
            'lodash',
            'axios',
            'jquery',
            'vue',
        ]);
    
    mix.version();
    

    然后你把它放在布局的底部:

    <script src="{{ mix('js/manifest.js') }}"></script>
    <script src="{{ mix('js/vendor.js') }}"></script>
    <script src="{{ mix('js/app.js') }}"></script>
    @stack('scripts')
    

    vendor.js 基本上是您的libraries.jsapp.js 是您的自定义代码。

    当您mix.version():如果您的自定义代码更改并且您npm run prod,则只有app.js 会更改(这是一个小JS 文件),而vendor.js(这是一个大文件)将保持不变相同的。这是一个巨大的优势,因为老用户只需加载小的app.jsvendor.js 仍将被缓存,从而加快加载速度。


    但是回答你的问题,它并没有选择变量名anime,所以在你的JS文件中像这样导入它以被识别:

    window.anime = require('animejs');
    

    【讨论】:

    • 谢谢! window.anime = require('animejs'); 这行确实是我需要的。
    • 很高兴它有效:) 您可以将其标记为正确答案以避免更多答案:P
    • 哎呀,忘记了,现在完成了。对于您回答的第一点,我实际上可以添加另一行这样的 mix.js('resources/js/libraries.js', 'public/js') 并将该文件中的所有库导入到单独的库和应用程序 javascript 中。这就是他提出这个问题的原因,我很高兴我现在终于可以使用这个设置了:-)
    • 嘿嘿好酷!对每个人来说:P很高兴你现在可以继续前进;)
    【解决方案3】:

    这可能会对你有所帮助。

    1. 我已将 give js 文件存储为.min.js 格式。
    2. 而不是使用 mix , 我已经使用asset 来获取 js 文件。
    <script src = "{{asset('js/anime.min.js')}}" type ="text/javascript"> </script>
    

    请检查这个。我没有发现任何问题。

    这是我尝试过的完整代码:

    <script src = "{{asset('js/anime.min.js')}}" type ="text/javascript">
    </script>
      <script>
      var textWrapper = document.querySelector('.ml6 .letters');
    textWrapper.innerHTML = textWrapper.textContent.replace(/\S/g, "<span class='letter'>$&</span>");
    
    anime.timeline({loop: false})
        .add({
        targets: '.ml6 .letter',
        translateY: ["1.1em", 0],
        translateZ: 0,
        duration: 750,
        delay: (el, i) => 50 * i
    }).add({
        targets: '.ml6',
        opacity: 0,
        duration: 1000,
        easing: "easeOutExpo",
        delay: 1000
    });
    </script>
    

    【讨论】:

    • 谢谢。我仍然想使用 mix,因为这是我为本地和生产环境编译所有资产的方式。在你的回答之后,我更加困惑为什么它不起作用。如果使用 asset() 包含 JS 文件有效,但 mix() 无效,而其余部分相同,那为什么呢?
    • @eskimo 要使用 mix 你需要 compile the js code into mix code.. 更多,laravel.com/docs/6.x/mix
    • 是的,我知道。它编译得很好。 anime.min.js 的 JS 代码在文件 libraries.js 中。所以混合和编译是有效的。就像我的问题中所描述的那样:如果我通过 CDN 单独加载 anime.min.js 它可以工作,如果我将它包含在 libraries.js 文件中它不会。我还是不明白为什么。
    【解决方案4】:

    尝试npm run watch,然后重试。

    【讨论】:

    • 抱歉忘了添加这个,但我每次保存时都会编译npm run watch,我可以看到该库包含在libraries.js 文件中,但它不起作用。
    最近更新 更多