2016-02-20 22 views
8

Tôi khá mới đối với JavaScript và đã phải vật lộn với hàng nhập khẩu gần đây. Có một điều tôi không thể quấn quanh đầu.Mô-đun nhập khẩu từ nhập khẩu 'mô-đun' khi không xuất được mặc định là gì và tại sao nó khác với nhập * dưới dạng Mô-đun?

Trong mô-đun nút cũ hơn (phần lớn là để xem ánh sáng trước ES6), có thể được cài đặt bằng cách sử dụng npm, chẳng hạn như express, thường không xuất được mặc định.

IDE của tôi (WebStorm) đánh dấu dòng sau với Xuất mặc định không được khai báo trong mô-đun nhập thông báo.

import express from 'express'; 

Thư này có thể được phá vỡ bằng cách cố gắng để nhập khẩu toàn bộ mô-đun như một bí danh sử dụng

import * as express from 'express'; 

ngầm nói với IDE của tôi chỉ nhập khẩu tất cả mọi thứ và đặt tên là express, tuy nhiên làm như vậy sau đó dẫn đến một express không phải là lỗi chức năng khi cố gắng khởi tạo ứng dụng trên dòng sau.

const app = express(); 

Đặc biệt nhập ban đầu (không có bí danh) hoạt động.

Chính xác những gì được nhập bằng cách sử dụng câu lệnh nhập khẩu mà không có bí danh, khi không xuất mặc định được xác định? Tôi nghĩ rằng đó là toàn bộ mô-đun, nhưng nó không có vẻ như vậy.

+1

Đây có thể là vấn đề với IDE của bạn mà không biết cách trình xử lý mô-đun của bạn xử lý các mô-đun trước ES6. Nếu nó hoạt động, bạn nên sử dụng nó và tắt thông báo hoặc tìm cách tuyên bố xuất các mô-đun được liên kết. – Bergi

+0

@Bergi Thông báo IDE không phải là vấn đề cũng không phải là vấn đề của câu hỏi. Tôi quan tâm hơn đến những gì được nhập khẩu như mặc định khi không có nhập khẩu như vậy được tuyên bố, như IDE của tôi chỉ ra. Tôi nên có lẽ đã nói tôi đang sử dụng webpack và babel với es-2015 cài sẵn để đóng gói các mô-đun vào một bó. Tôi không có thời gian, nhưng tôi sẽ chỉnh sửa câu hỏi khi tôi làm. –

+0

@DavidPacker WebStorm ngừng khiếu nại sau khi tải xuống và bật các tệp định nghĩa loại (ví dụ: 'express.d.ts') từ [github.com/DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped) trong * Setting> Ngôn ngữ & Khung> JavaScript> Thư viện> Tải xuống> express> Tải xuống và cài đặt * –

Trả lời

6

Nhập import Module from 'module' khi không xuất được mặc định là gì?

Không có gì. Trong thực tế, instantiating the module sẽ ném một SyntaxError khi một thứ được nhập không được xuất hoặc xuất nhiều lần từ mô-đun đã nhập.

Tại sao nó khác với import * as Module?

import * chỉ cần nhập module namespace object có hàng xuất khẩu làm tài sản. Nếu bạn không xuất bất cứ thứ gì, nó sẽ là một đối tượng trống.

Trong mô-đun nút cũ hơn, trước ES6 thường không xuất được mặc định.

Điều đó có nghĩa là bạn không thể nhập chúng dưới dạng mô-đun ES6. IDE của bạn dường như mong đợi rằng mặc dù và đưa ra cảnh báo.

Vậy điều gì sẽ xảy ra nếu bạn đề cập đến chúng trong tuyên bố import? Trình tải mô-đun của bạn có thể làm bất kỳ điều gì với nó và HostResolveImportedModule sẽ trả về một module record không phải là source text "ES6 module" record - tức là nó có thể thực hiện bất kỳ điều gì phụ thuộc vào việc triển khai thực hiện với mô-đun CommonJS.

+0

Vì vậy, việc nhập mô-đun trước ES6 bằng cách sử dụng cú pháp ES6 thay vì đồng bằng 'require' đơn giản sẽ không hoạt động và có lẽ lý do duy nhất là do chuyển đổi babel? Tôi có hiểu câu trả lời của bạn một cách chính xác không? –

+1

Không, nó hoạt động vì bộ nạp/gói mô-đun của bạn (gói webpack trong trường hợp của bạn) xử lý các mô-đun pre-ES6 một cách thích hợp. Không phải tất cả các trình tải/gói đều có thể hỗ trợ điều này, nó phụ thuộc vào việc triển khai thực hiện. Nhưng với mức độ hữu ích của việc nhập các mô-đun commonjs cũ, điều này sẽ không bị phá vỡ. Vấn đề của IDE của bạn là nó không biết về điều này. – Bergi

Các vấn đề liên quan