2015-04-22 25 views
11

Tôi muốn các chức năng tương tự như RequireJS empty:http://requirejs.org/docs/optimization.html#emptyLoại trừ một module từ webpack bó

use-case của tôi là tôi bao gồm jquery-migrate trong sự phát triển, nhưng tôi muốn loại trừ này khi xây dựng phục vụ sản xuất.

Sử dụng IgnorePlugin chỉ làm cho nó không bao gồm, và khi require ing nó trong các mã, nó sau đó ném một lỗi (Uncaught Error: Cannot find module "jquery-migrate").

Điều tôi muốn xảy ra là để nó chỉ trả lại không xác định hoặc một cái gì đó tương tự (như empty: trong RequireJS). Id không muốn chạm vào nhập trong mã, chỉ cần định cấu hình để trả về undefined.

EDIT: Sử dụng NormalModuleReplacementPlugin hoạt động, nếu tôi chỉ thay thế tệp trống. Nhưng giữ một tập tin trống xung quanh chỉ cho điều này có vẻ không cần thiết.

Trả lời

16

tôi sử dụng null-loader cho blanking ra mô-đun. Trình tải noop có thể được sử dụng cho một ít khó xử nếu có trong cấu hình.

Hãy thử:

rules: [{ 
    test: /jquery-migrate/, 
    use: IS_DEV ? 'null-loader' : 'noop-loader' 
}] 
+0

Điều này dường như làm việc cho tôi và tôi nghĩ rằng câu trả lời câu hỏi của OP tốt nhất. Không thay đổi mã, tôi vẫn có một 'import foo fro 'excluded-module'' ở đầu mã của tôi mà không có trình bao bọc' if (DEV) 'vui nhộn nào. Hãy tưởng tượng 'require ('excluded-module')' cũng hoạt động tốt. –

+2

Lưu ý đối với những người mới khác, các trình tải này không được bao gồm trong gói web: 'npm install --save-dev null-loader && npm install --save-dev noop-loader' – diachedelic

+0

Note2 - thêm' -loader' vào cuối tên bộ nạp. ví dụ. 'null-loader' ... –

3

Bạn có thể cố gắng làm cho một resolve.alias trong webpack.config:

resolve: { 
    alias: { 
     "jquery-migrate": process.env.NODE_ENV === 'production' ? "empty-module": "jquery-migrate" 
    } 
} 
+0

này vẫn buộc tôi phải có một mô-đun trống nằm xung quanh. Cleaner hơn 'NormalModuleReplacementPlugin', mặc dù :) – SimenB

+3

@Simen' npm i -D empty-module' – srcspider

1

Sử dụng Webpack của DefinePlugin kết hợp với các plugin sản xuất bình thường (Dedupe và làm xấu đi).

Sau đó trong mã của bạn, bạn có thể viết:

if(DEBUG) { 
    var test = require('test'); 
    alert(test); 
} 

Và khi nó được xây dựng trong sản xuất, DEBUG sẽ được thay thế bằng một chữ if(false) { ... } sẽ được loại bỏ hoàn toàn bởi các plugin làm xấu đi, vì vậy test sẽ chỉ có bắt buộc trong bản dựng gỡ lỗi.

Đây là một mẫu Grunt nhiệm vụ cấu hình cho grunt-webpackdevelopmentproduction mục tiêu cho nhiệm vụ:

 development: { 
      devtool: "sourcemap", 
      output: { 
       pathinfo: true, 
      }, 
      debug: true, 
      production: false, 
      plugins: [ 
       new webpack.DefinePlugin({ 
        DEBUG: true, 
        PRODUCTION: false 
       }) 
      ] 
     }, 

     production: { 
      plugins: [ 
       new webpack.DefinePlugin({ 
        DEBUG: false, 
        PRODUCTION: true 
       }), 
       new webpack.optimize.DedupePlugin(), 
       new webpack.optimize.UglifyJsPlugin({ 
        output: { 
         comments: false, 
        } 
       }) 
      ] 
     }, 
+0

Tôi thực sự thích trang trí mã nguồn với các câu lệnh debug hơn là trong các kịch bản công cụ xây dựng. Nó làm cho nó dễ hiểu hơn nhiều cho chính mình sau khi quay trở lại mã và những người khác khi cố gắng hiểu nơi mà jQuery-di chuyển đến từ đâu. –

+0

Đúng. Tuy nhiên, điều này không hiệu quả đối với AMD, ít nhất nếu được liệt kê trong lệnh gọi 'define' ban đầu. Sử dụng bí danh giống hệt 'rỗng:', ngoại trừ tôi phải tự tạo mô-đun 'trống'. – SimenB

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