Nhập ES2015 không hoạt động (ngay cả ở cấp cao nhất) trong Firefox


90

Đây là các tệp mẫu của tôi:

<!DOCTYPE html>
<html>
<head>
  <title>Test</title>
  <script src="t1.js"></script>
</head>
<body></body>
</html>

t1.js:

import Test from 't2.js';

t2.js:

export const Test = console.log("Hello world");

Khi tôi tải trang trong Firefox 46, nó trả về "Lỗi cú pháp: khai báo nhập có thể chỉ xuất hiện ở cấp cao nhất của mô-đun" - nhưng tôi không chắc ở đây có thể nhận được thêm bao nhiêu cấp cao nhất mà câu lệnh nhập có thể xuất hiện. Lỗi này có phải do cá trích đỏ không và có phải đơn giản là nhập / xuất chưa được hỗ trợ không?


2
Các mô-đun ES6 chưa được hỗ trợ trong các trình duyệt.
Felix Kling

2
Không đúng Felix. Thậm chí không phải trong năm 2016. Không được hỗ trợ bởi các trình duyệt 'Tất cả' sẽ chính xác hơn.
Andrew S,

Câu trả lời:


128

Trên thực tế, lỗi bạn gặp phải là do bạn cần phải tuyên bố rõ ràng rằng bạn đang tải một mô-đun - chỉ khi đó việc sử dụng các mô-đun mới được phép:

<script src="t1.js" type="module"></script>

Tôi đã tìm thấy nó trong tài liệu này về cách sử dụng ES6 import trong trình duyệt . Khuyến nghị đọc.

Được hỗ trợ đầy đủ trong các phiên bản trình duyệt đó (và mới hơn; danh sách đầy đủ trên caniuse.com ):

  • Firefox 60
  • Chrome (máy tính để bàn) 65
  • Chrome (android) 66
  • Safari 1.1

Trong các trình duyệt cũ hơn, bạn có thể cần bật một số cờ trong các trình duyệt:

  • Chrome Canary 60 - đằng sau cờ Nền tảng web thử nghiệm trong chrome:flags.
  • Firefox 54 - đang dom.moduleScripts.enabledcài đặt about:config.
  • Edge 15 - đằng sau cài đặt Tính năng JavaScript thử nghiệm trong about:flags.

1
Cảm ơn; đây có vẻ là thông tin mới (so sánh bảng hỗ trợ trình duyệt của câu trả lời trước với developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ) nên tôi đang chuyển sang câu trả lời của bạn vì importkhông còn được hỗ trợ nữa.
Christoph Burschka 27/09/17

1
hiện đang hoạt động mà không có bất kỳ cờ / cài đặt nào trong cạnh 16299 và chrome 64. Một lưu ý là cần nhập đường dẫn, không phải tệp, vì vậy trong t1.js: import Test from './t2.js';
Catweazle 18/02/18

@Catweazle Bạn có chắc là './t2.js'không './t2'.jschứ?
fredoverflow

@fredoverflow Vâng, tên đầy đủ phải được chỉ định, không giống như trong Node.js.
Tomáš Zato - Phục hồi Monica

cần một ví dụ đầy đủ, không chỉ nhập
bharal

14

Điều này không còn chính xác nữa. Tất cả các trình duyệt hiện tại đều hỗ trợ mô-đun ES6

Câu trả lời gốc bên dưới

Kể từ importMDN :

Tính năng này không được triển khai trong bất kỳ trình duyệt nào tại thời điểm này. Nó được triển khai trong nhiều trình chuyển đổi, chẳng hạn như Trình biên dịch Traceur, Babel hoặc Rollup.

Các trình duyệt không hỗ trợ import.

Đây là bảng hỗ trợ trình duyệt:

nhập mô tả hình ảnh ở đây

Nếu bạn muốn nhập các mô-đun ES6, tôi khuyên bạn nên sử dụng một trình vận chuyển (ví dụ: babel ).


Bạn có thể bật các tính năng này bằng cờ (chẳng hạn như trong chrome) không?
Evolutionxbox

4
@evolutionxbox: Nếu các tính năng không được tăng tốc , thì cũng không có cờ.
Bergi

1
Nếu các tính năng không được triển khai, tại sao tôi không gặp lỗi cú pháp hoặc lỗi cho tôi biết chúng không được triển khai? Điều này không có ý nghĩa.
Tomáš Zato - Phục hồi Monica

@ TomášZato, chỉ phụ thuộc vào bất cứ điều gì tuy nhiên trình duyệt bạn đang sử dụng quyết định xử lý nó
Josh chùm

1
Trên thực tế, đã xảy ra lỗi trong mã của tôi và nó hoạt động tốt. Không chắc chắn tại sao câu trả lời của bạn được ủng hộ. Các trình duyệt không hỗ trợ nhập sẽ báo cáo điều đó. Các lỗi như lỗi được đề cập là lỗi thực tế khi sử dụng nhập khẩu.
Tomáš Zato - Phục hồi Monica

2

Chỉ sử dụng phần mở rộng tệp .js trong khi nhập tệp đã giải quyết được vấn đề tương tự (đừng quên đặt type="moduletrong thẻ tập lệnh).

Đơn giản chỉ cần viết:

import foo from 'foo.js';

thay vì

import foo from 'foo';

1

Thêm type=modulecác tập lệnh nhập và xuất các mô-đun sẽ giải quyết vấn đề này.


0

bạn phải chỉ định loại của nó trong tập lệnh và xuất phải là mặc định .. ví dụ trong trường hợp của bạn,

<script src='t1.js' type='module'>

cho t2.js sử dụng mặc định sau khi xuất như thế này, xuất mặc định 'biểu thức của bạn ở đây' (bạn không thể sử dụng biến ở đây) . bạn có thể sử dụng chức năng như thế này,

export default function print(){ return console.log('hello world');}

và để nhập, cú pháp nhập của bạn phải như thế này, nhập print từ './t2.js' (sử dụng phần mở rộng tệp và ./ cho cùng một thư mục) .. Tôi hy vọng điều này sẽ hữu ích cho bạn!


0

Vì lợi ích của các lập luận...

Người ta có thể thêm một giao diện mô-đun tùy chỉnh vào đối tượng cửa sổ chung. Mặc dù, nó không được khuyến khích. Mặt khác, DOM đã bị hỏng và không có gì tồn tại. Tôi sử dụng điều này mọi lúc để tải chéo các mô-đun động và đăng ký trình nghe tùy chỉnh. Đây có lẽ không phải là một câu trả lời- nhưng nó hoạt động. Tràn ngăn xếp hiện có một module.export gọi một sự kiện có tên là 'Spork' - ít nhất là cho đến khi làm mới ...

//  spam the global window with a custom method with a private get/set-interface and     error handler... 

window.modules = function(){
  window.exports = {
    get(modName) {
      return window.exports[modName] ? window.exports[modName] : new Error(`ERRMODGLOBALNOTFOUND [${modName}]`)
    },
    set(type, modDeclaration){
      window.exports[type] = window.exports[type] || []
      window.exports[type].push(modDeclaration)

    }
  }

}

//  Call the method
window.modules()

//  assign a custom type and function
window.exports.set('Spork', () => console.log('SporkSporSpork!!!'))


// Give your export a ridiculous event subscription chain type...
const foofaalala = window.exports.get('Spork')

// Iterate and call (for a mock-event chain)
foofaalala.forEach(m => m.apply(this))

//  Show and tell...
window
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.