Dazipo
@Dazipo

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Flask + HTML + JS で JavaScriptのモジュール化での問題

解決したいこと

Flask + HTML + JS でWebアプリを作成している。
JSをモジュール化した際に、モジュール化されたJSファイルが読み込めない。

発生している問題・エラー

Flask実行時エラーは無し、開発者モードにて該当のJSファイルがソースに存在することは確認できている。

該当するソースコード

a
  • JavaScript (main1edit.js)
import { loadListTable, applySurfaceLogic } from './components/TableManager.js';
import { initializeEventListeners } from './utils/EventHandlers.js';
import { initializeButtonGrid } from './components/ButtonManager.js';

document.addEventListener('DOMContentLoaded', () => {
    loadListTable();
    initializeButtonGrid();
    document.querySelectorAll('#list-table-section tbody tr').forEach(row => {
        applySurfaceLogic(row);
    });
    initializeEventListeners();
});
  • components (ButtonManager.js)
export const loadButtonGrid = () => {
    const buttonTexts = [
        'Data Select', '表裏面各種欠陥', '裏面各種欠陥', '表裏面スクラッチ', 'Data Export', 'List Settings'
    ];

    // ボタンセクションを取得
    const buttonSection = document.getElementById('button-section');

    if (!buttonSection) {
        console.error('ボタンセクションが見つかりません。HTML内に "button-section" ID を確認してください。');
        return;
    }

    // ボタンを生成
    let buttonGridHTML = '<div class="grid-button-container">';
    buttonTexts.forEach((text, index) => {
        buttonGridHTML += `<button class="grid-button" data-id="button${index + 1}">${text}</button>`;
    });
    buttonGridHTML += '</div>';

    // ボタンセクションにHTMLを挿入
    buttonSection.innerHTML = buttonGridHTML;

    // イベントリスナーを追加
    document.querySelectorAll('.grid-button').forEach(button => {
        button.addEventListener('click', (event) => {
            console.log(`${event.target.textContent} ボタンがクリックされました`);
        });
    });

    console.log('ボタンが正しく生成されました');
};

  • HTML (index.html)
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>SAC</title>
    <link rel="stylesheet" href="/static/css/styles2.css">
    <link rel="stylesheet" href="/static/css/button.css"> <!-- ボタンコンテナ用のCSS -->
    <link rel="stylesheet" href="/static/css/list-table.css"> <!-- リスト表用のCSS -->
    <link rel="stylesheet" href="/static/css/form.css">
    <!--<link rel="stylesheet" href="/static/css/input-form-2.css"> 入力フォーム2用のCSS -->
    <!--<script src="https://cdn.socket.io/4.0.0/socket.io.min.js" defer></script>  Socket.IOの読み込み -->
    <script defer src="/static/js/main2.js"></script>
    <script defer src={{ url_for('static', filename= '/static/js/main1edit.js')}}></script>
</head>

ディレクトリ構成

project/ 
├── static/ 
│ ├─── js
|   ├──main1edit.js
|   ├──main2.js
│   ├──components
|   | └──ButtonManager.js
|   └──utils
|     └──DOMUtils.js
├── template/ 
│ └── index.HTML 
└── app.py

自分で試したこと

  • HTML内のID名は問題なく一致している
  • pathの取り方も url_for と相対パスと2種類とっている
  • main2.jsは問題なく反映されている。モジュール化したmain1edi.jsだけ反映されない
0

2Answer

JavaScript モジュールを HTML で読み込むためには script タグに type="module" 属性をつける必要があります。以下のようにしてください。

<script defer type="module" src={{ url_for('static', filename= '/static/js/main1edit.js')}}></script>
3Like

モジュール化したmain1edi.jsだけ反映されない

以下の記事と似たような話と違いますか?

Flask 開発サーバーが .mjs ファイルの応答で Content-Type: text/plain を返す問題

上の記事は、開発マシンが Windows OS の場合、Flask 開発サーバーが拡張子 .mjs のファイルを応答として返す時、応答ヘッダの Content-Type が text/plain になるので、ブラウザは受信したスクリプトのロードに失敗するというものですが、質問者さんのケース .js の場合も似たようなことが起こっているとか?

上の記事の書いてあるようにブラウザのディベロッパーツールの Console を見てください。

質問するときは必ず、開発マシンの OS は何かなど、開発環境を書いてください。

1Like

Comments

  1. とにかくブラウザの開発ツールの Console タブを見てください。@uasi さんの回答が当たりだと思いますが、その場合でもエラーメッセージは出るので原因が分かると思います。

  2. @Dazipo

    Questioner

    ありがとうございます。
    原因調査やってみます。

Your answer might help someone💌