You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Vite构建时保留script标签的初始顺序?

如何在Vite构建时保留script标签的初始顺序?

你的场景是:在index.html的head中按如下顺序放置脚本:

<script src="js/initMap.js" type="module"></script>
<script defer src="https://maps.googleapis.com/maps/api/"></script>

但构建后脚本顺序被反转,可能导致依赖逻辑出错。

Vite默认会对HTML中的脚本做优化排序,将外部资源与本地模块脚本调整顺序以提升加载性能。要保留初始顺序,可以试试以下两种方法:

方法一:使用data-vite-preserve属性

给需要保持顺序的脚本标签添加data-vite-preserve属性,告知Vite不调整该脚本的位置:

<script src="js/initMap.js" type="module" data-vite-preserve></script>
<script defer src="https://maps.googleapis.com/maps/api/" data-vite-preserve></script>

添加该属性后,Vite会保留这些脚本的原始顺序,不做优化调整。

方法二:通过Vite配置自定义HTML转换

在vite.config.js中使用transformIndexHtml钩子,手动控制脚本顺序:

export default {
  plugins: [
    {
      transformIndexHtml(html) {
        // 提取所有script标签
        const scriptTags = html.match(/<script[^>]*>[\s\S]*?<\/script>/g) || [];
        // 移除原有脚本,再按原始顺序重新插入到head末尾
        let processedHtml = html.replace(/<script[^>]*>[\s\S]*?<\/script>/g, '');
        scriptTags.forEach(tag => {
          processedHtml = processedHtml.replace('</head>', `${tag}</head>`);
        });
        return processedHtml;
      }
    }
  ]
};

这个钩子会在构建阶段修改HTML内容,确保脚本保持你设定的初始顺序。

额外注意事项

由于type="module"脚本默认延迟执行(和defer行为类似),即使标签顺序正确,也需要确保谷歌地图脚本加载完成后再执行initMap.js中的逻辑。可以在initMap.js中添加如下判断:

function initMap() {
  // 这里写你的地图初始化代码
}

// 检查谷歌地图是否已加载
if (window.google?.maps) {
  initMap();
} else {
  // 监听外部脚本加载完成事件
  const mapScript = document.querySelector('script[src="https://maps.googleapis.com/maps/api/"]');
  mapScript.addEventListener('load', initMap);
}

内容的提问来源于stack exchange,提问作者Flavien Laureau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:10:31