javascript - Symfony + Webpack 在模板中使用节点包
问题描述
我正在尝试在我的 Symfony 项目中实现 Webpack Encore。我刚刚添加了带有节点 ( ) 的SweetAlert2 。npm i sweetalert2 --dev
我的“问题”是我不知道安装后如何正确使用这个包。我一直在阅读其他问题,但我不明白我需要在哪里导入它。
到目前为止,我已经尝试过:
- 在
/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
});
}
- 将其添加
webpack.config.js
为入口点:
.addEntry('app', './assets/js/app.js')
.addEntry('swal', '/assets/js/swal.js')
使用 .将其作为资产添加到模板中
<script src="{{ asset('js/swal.js') }}"></script>
。也许值得一提的是,我确实尝试了所有路径,但 PHPStorm 无法识别其中任何一个。打印 Twig 模板中的函数或类:
<!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
未定义导入它。
我应该怎么做才能实现这个功能并在 Twig 模板中渲染它?
解决方案
您只能在 javascript(或 typescript 等)文件中导入模块。
假设您在 twig 模板的脚本中有一个函数:
<script>
function doSomethingBasic() {
// do your thing here, then alert the user using Swal
}
</script>
您应该做的是将 javascript 标记内的所有内容导出到 /assets 文件夹内的新 .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
});
}
这将触发页面加载的第二个。如果需要,您也可以制作按钮触发器。
推荐阅读
- powershell - 使用 powershell 进行敏感词搜索
- python - Igraph 绘图损坏节点名称
- batch-file - 如何通过使用批处理比较两个文本文件来删除重复的单词或行?
- php - PHP中多维数组的总和值
- python - 在 GridLayout kivy 中添加多个 GridLayout
- javascript - 从 API MVC C# 填充下拉选项值
- interrupt - Cortex M 架构中的 uint16_t 和 uint32_t 中断是否安全?
- c# - 找不到方法:'System.Collections.ObjectModel.Collection`1
- vega-lite - vega-lite中的散点图矩阵
- javascript - 在javascript中对具有许多条件的数组进行排序