簡體   English   中英

Symfony + Webpack 在模板中使用節點包

[英]Symfony + Webpack using node packages inside templates

我正在嘗試在我的 Symfony 項目中實現 Webpack Encore。 我剛剛添加了SweetAlert2和節點( npm i sweetalert2 --dev )。

我的“問題”是我沒有意識到如何在安裝后正確使用這個 package。 我一直在閱讀其他問題,但我不明白我需要在哪里導入它。

到目前為止,我已經嘗試過:

  1. /assets/js/swal.js中創建一個文件。 另外,我也嘗試過使用 ES5:
import Swal from 'sweetalert2';

export const swal = (message, type) => {
    Swal.fire({
        position: 'top-end',
        icon: type,
        title: message,
        showConfirmButton: false,
        timer: 1500
    });
}
  1. 將其添加到webpack.config.js作為入口點:
.addEntry('app', './assets/js/app.js')
.addEntry('swal', '/assets/js/swal.js')
  1. 使用<script src="{{ asset('js/swal.js') }}"></script>將其作為資產添加到模板中。 也許值得一提的是,我確實嘗試了所有路徑,但 PHPStorm 無法識別其中任何一個。

  2. 在 Twig 模板中打印 function 或 class :

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}Welcome!{% endblock %}</title>
        {% block stylesheets %}{% endblock %}

        {{ encore_entry_link_tags('app') }}
    </head>
    <body>
        {% block body %}{% endblock %}

        {{ encore_entry_script_tags('app') }}
        {% block javascripts %}{% endblock %}

        {% if app.flashes is not empty %}
            <script>
                console.log(swal);
            </script>
        {% endif %}
    </body>
</html>

我也嘗試使用require()導入它,但require沒有定義。

我應該怎么做才能實現這個 function 並在 Twig 模板中呈現它?

您只能在 javascript(或 typescript 等)文件中導入模塊。

假設您在 twig 模板的腳本中有一個 function :

<script>
  function doSomethingBasic() {
     // do your thing here, then alert the user using Swal
  }
</script>

您應該做的是將 javascript 標記內的所有內容導出到 /assets 文件夾內的 new.js 文件中。

在 /assets 文件夾中創建具有所需名稱的新文件后,應將該條目添加到 webpack.config.js。

例如:您在 /assets 中創建了 newJavascript.js。

在 webpack.config.js 內部:

.addEntry(`literallyAnyName`, `/assets/newJavascript.js`)

然后,在您的 twig 模板中,替換您的腳本標簽(必須是您在 webpack.config.js 中輸入的名稱,在本例中為字面意思是 AnyName):

{{ encore_entry_script_tags('literallyAnyName') }}

有了這個,你可以在你的 newJavascript.js 中導入 Swal

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}Welcome!{% endblock %}</title>
        {% block stylesheets %}
          {{ encore_entry_link_tags('literallyAnyName') }}
        {% endblock %}
    </head>
    <body>
        {% block body %}{% endblock %}

        {% set flashes = [] %}
        {% if app.flashes is not empty %}
          {% for label,message in app.flashes %}
             {% set flashes = flashes|merge([{
               'type': label,
               'message': message
             }]) %}
          {% endfor %}
        {% endif %}
            <div id="flashes" data-flashes="{{ flashes|json_encode|e('html_attr') }}"></div>
        {% block javascripts %}
          {{ encore_entry_script_tags('literallyAnyName') }}
        {% endblock %}
    </body>
</html>

newJavascript.js:

const flashes = JSON.parse(document.querySelector(`#flashes`).dataset.flashes);

// Maybe reduce the flash object into one message using flashes.reduce;
if(flashes.length > 0) {

  const msg = flashes.reduce(/* your logic here */);

  Swal.fire({
    position: 'top-end',
    icon: type,
    title: msg,
    showConfirmButton: false,
    timer: 1500
  });

}

這將觸發頁面加載的第二個。 如果需要,您也可以制作按鈕觸發器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM