質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • JavaScript

    15333questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Node.js

    1737questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • npm

    246questions

    npmは、Node Packaged Modulesの略。Node.jsのライブラリ・パッケージを管理できるツールです。様々なモジュールを簡単にインストールでき、自分でモジュールを作成し公開する際にも使用できます。

  • IntelliJ IDEA

    124questions

    IntelliJ IDEA(インテリジェイ アイディア)は、JetBrains社が開発した、 JavaやScalaなどで利用される統合開発環境です。

(Javascript)モジュールのexportとimportが上手くいきません。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 714

Saggitarie

score 2

 前提・実現したいこと

*Javascriptの初心者です。

BMIを測定する簡単WebアプリをJavascriptで作成しています。
IntelliJで実行しようとすると、Chromeのコンソールにエラーが表示されます。
モジュールのimportとexportが上手く行きません。

 発生している問題・エラーメッセージ

Uncaught SyntaxError: Unexpected identifier

 該当のソースコード

index.html

<!doctype html>
<html lang="ja">
<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">

    <title>あなたのBMI</title>
</head>
<body>

<h2 id="title"> あなたのBMIを測定します。</h2>

<form id="userForm" class="userForm">
    名前:<input type="text" id="name"><br><br>
    体重:<input type="number" name="weight">
    身長:<input type="number" name="height">
    <input type="submit" value="送信">
</form>
<br>
<div class="container">
    <table class="table">
        <thead>
        <tr>
            <th>#</th>
            <th>名前</th>
            <th>身長</th>
            <th>体重</th>
            <th>BMI 結果</th>
        </tr>
        </thead>
        <tbody id="userInfo">

        </tbody>
    </table>
</div>

<div class="userList">
    <ul id="bmi_list">
    </ul>
</div>


<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->

<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
<script src="index.js"></script>
</body>
</html>


index.js

import {Information} from './info';

// inputタグを全て要素ノードの集合(配列)として取得する。
// その他の要素ノードはidで識別することにする。
let userForm = document.getElementById('userForm');
let input = document.getElementsByTagName('input');
let name = document.getElementById('name');
let userInfo = document.getElementById('userInfo');


let info = [];

//BMIの計算結果を画面に表示するための関数
let bmi_result = (event) => {



    let id = info.length + 1;
    //formを送信した時の挙動を制御する
    event.preventDefault();

    //受け取った体重と身長を使ってbmiを計算を行い、その結果を戻り値としてresult変数に保持する。
    let result = bmi_calculation(input[1].valueAsNumber, input[2].valueAsNumber);
    result = result.toString();

    //ユーザーの情報をInfoクラスのインスタンスを生成すると同時に渡してあげる。
    info.push(new Information((id, name.value, input[1].value, input[2].value, result));

    /*
     * tableタグの子要素として、それぞれの情報を格納して、
     *  画面に表示させる。 
     */
    let tr = document.createElement('tr');


    let th = document.createElement('th');
    th.scope = 'row';
    th.innerText = info[info.length].id;
    tr.appendChild(th);


    let td = document.createElement('td');
    td.innerText = info[info.length].name;
    tr.appendChild(td);

    td = document.createElement('td');
    td.innerText = info[info.length].weight;
    tr.appendChild(td);

    td = document.createElement('td');
    td.innerText = info[info.length].height;
    tr.appendChild(td);

    td = document.createElement('td');
    td.innerText = info[info.length].bmi;
    tr.appendChild(td);


    /* 最終的に、tbodyタグの子要素として追加する。*/
    userInfo.appendChild(tr);


    input[0].value = "";
    input[1].value = "";
    input[2].value = "";

}

//BMIの計算をして、bmi_resultに計算結果を返却する関数
let bmi_calculation = (weight, height) => {
    let weight_number = weight;
    let height_number = height;

    return  weight_number / ((height_number/100)**2);
}


//formタグのイベントリスナーがsubmitボタンが押されたことにより発動する。
userForm.addEventListener('submit',bmi_result, false);

info.js

export class Information{
    constructor(user_id, name, weight, height, bmi){

            this.id = user_id;
            this.name = name;
            this.weight = weight;
            this.height = height;
            this.bmi = bmi;
    }
};

npm run buildした後にdestフォルダ下に作成されたindex.html

<!doctype html>
<html lang="ja">
<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">

    <title>あなたのBMI</title>
</head>
<body>

<h2 id="title"> あなたのBMIを測定します。</h2>

<form id="userForm" class="userForm">
    名前:<input type="text" id="name"><br><br>
    体重:<input type="number" name="weight">
    身長:<input type="number" name="height">
    <input type="submit" value="送信">
</form>
<br>
<div class="container">
    <table class="table">
        <thead>
        <tr>
            <th>#</th>
            <th>名前</th>
            <th>身長</th>
            <th>体重</th>
            <th>BMI 結果</th>
        </tr>
        </thead>
        <tbody id="userInfo">

        </tbody>
    </table>
</div>

<div class="userList">
    <ul id="bmi_list">
    </ul>
</div>



<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->

<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
<script src="../src/index.js"></script>
<script type="text/javascript" src="index.bundle.js"></script></body>
</html>

webpack.config.babel.js

import path from 'path';
import HtmlWebpackPlugin from 'html-webpack-plugin';

const PUBLIC_DIR = path.resolve(__dirname, "dest");

export default {
    mode: 'production',
    entry: './src/info.js',
    output: {
        path: PUBLIC_DIR,
        filename: 'index.bundle.js'
    },
    module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['react']
                    }
                }
            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: './src/index.html',
            filename: './index.html'
        })
    ]
};


package.json

{
  "name": "javascript-todo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build": "webpack",
    "test": "jest"
  },
  "repository": {
    "type": "git",
    "url": "https://net2018-gitlab.casareal.co.jp/samples/testing-javascript.git"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.4",
    "babel-preset-env": "^1.6.1",
    "babel-preset-react": "^6.24.1",
    "html-loader": "^0.5.5",
    "html-webpack-plugin": "^3.2.0",
    "jest": "^22.4.3",
    "webpack": "^4.6.0",
    "webpack-cli": "^2.0.14"
  }
}

BMI_Test.iml

<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
  <component name="NewModuleRootManager" inherit-compiler-output="true">
    <exclude-output />
    <content url="file://$MODULE_DIR$" />
    <orderEntry type="sourceFolder" forTests="false" />
  </component>
</module>
{
  "presets": ["env", "react"]
}

 試したこと

何故、info.jsがChrome上で認識されないのかがわかりません。
export default class Information{};やexport class Information{}両方のパターンを試してみましたが、どうしてもモジュール間で受け渡しができません。

 補足情報(FW/ツールのバージョンなど)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • easy_no_easy

    2018/05/04 17:37

    ビルドツールはwebpackですか???タスクを実行するjavascriptも記載してください。

    キャンセル

  • miyabi-sun

    2018/05/05 12:29 編集

    私もビルド無しで動くわけないだろうと思ってたのですが、MDN見たら「ChromeやFirefox等のブラウザではぼちぼち実装されてきています」という記述を見かけましたね。だから質問文で動かないといっている状況と相違するので静観していました。

    キャンセル

  • Saggitarie

    2018/05/05 13:29

    easy_no_easyさん → ビルドツールはwebpackを使っています。後ほど、そちらのソースコードも追加しておきます。

    キャンセル

  • Saggitarie

    2018/05/05 13:34

    miyabi-sunさん → ビルドを動かしてから実行しても、Chromeのコンソール上のimport文の箇所に赤い波線が引かれている状態でした。maisumakunさんの方法で試したところ、無事にモジュールを認識してくれました。

    キャンセル

回答 2

checkベストアンサー

+3

ブラウザでimportを実行する場合、

  • <script>type="module"と指定する
  • importするJavaScriptの拡張子を省略しない

などが必要になります。

なお、ブラウザによるimportexportの実装はIEが非対応なほか、Firefoxも次のバージョンまでは特殊な設定をして有効化する必要があるような状態なので、実運用に入れるのは少し早い気もします(Can I use)。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/04 18:54

    maisumakunさんの方法でソースコードを書き直したところ、無事エラーをなくすことができました。
    本当に助かりました。
    ありがとうございます!

    キャンセル

-1

うまくいかないというのは、importそのものができていないということでしょうか???
どこかに構文エラーがあるのではないでしょうか??
Uncaught SyntaxError: Unexpected identifier

import {Information} from './info';

importするときは波括弧要らなかったような気がしますが・・・。
import Information from './info';

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    15333questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Node.js

    1737questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • npm

    246questions

    npmは、Node Packaged Modulesの略。Node.jsのライブラリ・パッケージを管理できるツールです。様々なモジュールを簡単にインストールでき、自分でモジュールを作成し公開する際にも使用できます。

  • IntelliJ IDEA

    124questions

    IntelliJ IDEA(インテリジェイ アイディア)は、JetBrains社が開発した、 JavaやScalaなどで利用される統合開発環境です。