โมดูล ES6 ในเบราว์เซอร์: Uncaught SyntaxError: การนำเข้าโทเค็นที่ไม่คาดคิด


86

ฉันเพิ่งเริ่มใช้ES6 (ECMAScript 6) และฉันต้องการใช้ระบบโมดูลในเบราว์เซอร์ ฉันอ่าน ES6 ได้รับการสนับสนุนโดย Firefox และ Chrome แต่ฉันได้รับข้อผิดพลาดต่อไปนี้โดยใช้export

Uncaught SyntaxError: Unexpected token import

ฉันมีไฟล์ test.html

<html>
    <script src="test.js"></script>
<body>
</body>
</html>

และไฟล์ test.js

'use strict';

class Test {

    static hello() {
        console.log("hello world");
    } 
}

export Test;    

ทำไม?


ยังไม่รองรับโมดูล ES6 ในเบราว์เซอร์ นอกจากนี้คุณยังโหลดสคริปต์ไม่ใช่โมดูล
Bergi

3
ฉันยังไม่เข้าใจความแตกต่างระหว่างสคริปต์และโมดูล
cdarwin


20
ส่วนสำคัญที่ฉันสังเกตเห็นคือ<script type="module"></script>ตรวจสอบให้แน่ใจว่าคุณเพิ่มไม่เช่นนั้นคุณจะได้รับข้อผิดพลาดนั้น ฉันทุบหัวของฉันบนผนังอย่างต่อเนื่อง<script>import ... </script>โดยรู้ว่าโครเมี่ยมได้รับการกล่าวว่ารองรับโมดูล ES6 โดยไม่มีแฟล็กจากนั้นฉันสังเกตเห็นว่าจำเป็นต้องใช้แอตทริบิวต์ประเภทเพื่อระบุให้เบราว์เซอร์ว่านี่คือโมดูล ES6 โดยที่คุณไม่ได้รับสิ่งนั้น ข้อผิดพลาด
Emmanuel Mahuni

1
ฉันใช้ Chrome 68 ฉันยังคงเห็นข้อผิดพลาดนี้เมื่อเราใช้การนำเข้า * จาก
บูรณาการ

คำตอบ:


66

ตอนนี้เบราว์เซอร์สมัยใหม่จำนวนมากรองรับโมดูล ES6 ตราบเท่าที่คุณนำเข้าสคริปต์ของคุณ (รวมถึงจุดเข้าสู่แอปพลิเคชันของคุณ) โดยใช้สคริปต์<script type="module" src="...">นี้

ดูรายละเอียดเพิ่มเติมได้ที่caniuse.com : https://caniuse.com/#feat=es6-module


53

คุณสามารถทดลองใช้โมดูล ES6 ใน Google Chrome Beta (61) / Chrome Canary

การอ้างอิงการใช้งาน ToDo MVC โดย Paul Irish - https://paulirish.github.io/es-modules-todomvc/

ฉันสาธิตขั้นพื้นฐาน -

//app.js
import {sum} from './calc.js'

console.log(sum(2,3));
//calc.js
let sum = (a,b) => { return a + b; }

export {sum};
<html> 
    <head>
        <meta charset="utf-8" />
    </head>

    <body>
        <h1>ES6</h1>
        <script src="app.js" type="module"></script>
    </body>

</html>

หวังว่าจะช่วยได้!


33
ถูกต้อง ... ส่วนสำคัญที่ฉันสังเกตเห็นคือ<script type="module"></script>ต้องแน่ใจว่าคุณเพิ่มเข้าไปไม่เช่นนั้นคุณจะได้รับข้อผิดพลาดนั้น ฉันทุบหัวของฉันบนผนังอย่างต่อเนื่อง<script>import ... </script>โดยรู้ดีว่าตอนนี้โครเมี่ยมได้รับการกล่าวว่ารองรับโมดูล ES6 โดยไม่มีแฟล็กจากนั้นฉันสังเกตเห็นว่าจำเป็นต้องใช้แอตทริบิวต์ประเภทเพื่อระบุให้เบราว์เซอร์ว่านี่คือโมดูล ES6
Emmanuel Mahuni

1
{"message": "Uncaught SyntaxError: โทเค็นที่ไม่คาดคิด {", "filename": " stacksnippets.net/js ", "lineno": 24, "colno": 8}
hoogw

4
ฉันพบข้อผิดพลาดข้างต้นโดยเรียกใช้ข้อมูลโค้ดด้านบนใช้ chrome v67 ทำไม
hoogw

@hoogw Stackoverflow เพิ่มให้เรียกใช้ข้อมูลโค้ดโดยอัตโนมัติ ไม่สามารถเรียกใช้รหัสนี้ได้ตามที่เป็นอยู่ คุณต้องคัดลอกโค้ดไปที่ index.html และแยกไฟล์. js ตามที่แสดงด้านบนแล้วลองในเบราว์เซอร์!
Roopesh Reddy

ขอบคุณคำตอบที่มีประโยชน์ ฉันลบ snippet runner ให้คุณแล้ว (ดังที่ฉันเห็นตัวอย่าง StackOverflow ไม่สามารถมีมากกว่าหนึ่งjsแหล่ง)
Mir-Ismaili

25

ขออภัยเบราว์เซอร์หลายโมดูลไม่รองรับโมดูลในขณะนี้

คุณลักษณะนี้เพิ่งเริ่มใช้งานได้ในเบราว์เซอร์ในขณะนี้ มีการนำไปใช้ในทรานส์ไพเลอร์หลายตัวเช่น TypeScript และ Babel และบันเดิลเลอร์เช่น Rollup และ Webpack

พบในMDN


ฉันอ่านว่าฟีเจอร์นี้ถูกนำมาใช้ในคำถาม Sof แต่แหล่งที่มาของ MDN นั้นเชื่อถือได้มากกว่า
cdarwin

ตามลิงค์ต่อไปนี้ Chrome 61 ควรรองรับการนำเข้า - ไม่ medium.com/dev-channel/…
Marc

4
คุณต้องเพิ่ม type = "module" ในแท็กสคริปต์ของคุณ
smohadjer

10

มันใช้งานได้สำหรับฉันที่เพิ่มtype="module"เข้าไปในสคริปต์ในimportmjs ของฉัน:

<script type="module">
import * as module from 'https://rawgit.com/abernier/7ce9df53ac9ec00419634ca3f9e3f772/raw/eec68248454e1343e111f464e666afd722a65fe2/mymod.mjs'

console.log(module.default()) // Prints: Hi from the default export!
</script>

ดูการสาธิต: https://codepen.io/abernier/pen/wExQaa

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.