2016-09-25 12 views
6

Tôi bắt đầu với Rollup và D3 phiên bản 4, được viết bằng các mô-đun ES2015. Tôi đã viết một số mã bằng cách sử dụng không gian tên D3 truyền thống "d3". Bây giờ tôi muốn tạo một gói tùy chỉnh bằng cách sử dụng Rollup. Tôi muốn sử dụng cây lắc, bởi vì tôi có lẽ chỉ sử dụng khoảng một nửa các chức năng trong d3, và tôi muốn giữ mọi thứ càng nhẹ càng tốt.Làm cách nào để nhập các hàm mô-đun ES2015 có chọn lọc, nhưng với cách đặt tên không?

Tôi rõ ràng rằng tôi có thể nhập các chức năng một cách chọn lọc, ví dụ .:

import {scaleLinear} from "d3-scale"; 
import { 
     event, 
     select, 
     selectAll 
} from "d3-selection"; 

Đó là sẽ nhận được rất tiết rất nhanh, bởi vì một nửa số d3 là rất nhiều chức năng. Tôi có thể sống với điều đó. Vấn đề lớn hơn là nó cũng sẽ yêu cầu viết lại hoàn toàn tất cả các định danh hàm của tôi mà không có một vùng tên. Tôi không quan tâm nhiều đến điều đó, bởi vì tôi thích không gian tên mã thư viện.

Tôi hiểu rằng tôi có thể nhập tất cả các mô-đun:

import * as d3 from "d3"; 

mà bảo tồn không gian tên đối tượng d3, đó là tốt cho tổ chức mã của tôi. Nhưng sau đó Rollup không thể cây lắc các chức năng không sử dụng ra khỏi bó.

Những gì tôi đang mơ về một cái gì đó như:

import { 
     event, 
     select, 
     selectAll 
} as d3 from "d3-selection"; 

nhưng mà loại tính năng/cú pháp dường như không tồn tại trong spec. Làm cách nào để tôi có thể nhắm mục tiêu có chọn lọc từng phần riêng lẻ của mô-đun và bảo toàn không gian tên trong khi nhập?

+0

Bạn có thể sử dụng '*' nhập và Rollup sẽ cây lắc chúng miễn là bạn không sử dụng chính không gian tên (ví dụ: chuyển nó vào hàm). Nhưng cây lắc không phải là hoàn hảo (vì bản chất của JavaScript) nên việc nhập trực tiếp từ 'd3' sẽ bao gồm mã không sử dụng (chúng tôi đang cố gắng làm cho nó tốt hơn), vì vậy việc nhập khẩu có chọn lọc từ các mô-đun bạn cần sẽ luôn cung cấp cho bạn gói được tối ưu hóa cao nhất. Cá nhân tôi ưu tiên nhập khẩu một cách rõ ràng các hàm tôi đang thực sự sử dụng, nhưng @estus có ý tưởng đúng nếu bạn không muốn làm điều đó. –

+0

@RichHarris Việc nhập khẩu có chọn lọc (Tôi cho rằng bạn có nghĩa là nhập khẩu có tên) dẫn đến rung lắc cây khác nhau hơn là chọn lọc bằng cách sử dụng đối tượng không gian tên? – Bergi

+0

@Bergi vì sau đó bạn có thể nhập dễ dàng hơn từ ví dụ: 'd3-selection',' d3-scale' et al, thay vì 'd3' –

Trả lời

4

Bạn cần một mô-đun tái xuất khẩu cho rằng:

export { 
     event, 
     select, 
     selectAll 
} from "d3-selection"; 

import * as d3 from './d3'; 
0

rằng loại tính năng/cú pháp dường như không tồn tại trong spec

Không, điều này thực sự là không thể. Theo thông số kỹ thuật, một khi mô-đun được bao gồm, toàn bộ mô-đun được đánh giá và bao gồm, do đó không cần phải đưa vào một phần. Một đối tượng không gian tên luôn cho phép truy cập vào tất cả các thuộc tính của mô-đun.

Nhưng sau đó Rollup không thể lắc các chức năng không được sử dụng trong gói.

Đó sẽ là lỗi của Rollup, nhưng trên thực tế nó có thể phân tích tĩnh mã để sử dụng đối tượng vùng tên và tìm ra thuộc tính nào được sử dụng. Việc tối ưu hóa này có thể cần phải giải cứu nếu đối tượng được sử dụng cho bất kỳ thứ gì không phải là truy cập thành viên chấm chấm, nhưng nói chung nó hoàn toàn có thể. Nếu nó không hoạt động như mong đợi, bạn có thể muốn gửi báo cáo lỗi (xem thêm troubleshooting).

+0

Rollup có thể lắc cây 'import * như câu lệnh foo' giống như bất kỳ câu lệnh nào khác - miễn là bạn không sử dụng không gian tên theo cách làm cho nó được 'reified' (ví dụ: chuyển nó vào một hàm) –

+0

@RichHarris Vâng, đó là ý của tôi. (Tôi đoán tôi nên đọc tài liệu để nói rằng tài liệu đã được triển khai, thay vì yêu cầu gửi yêu cầu tính năng) – Bergi

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