SORU
23 Kasım 2013, CUMARTESİ


Nasıl göreli yol çok grunt-browserify demetleri aliasing yönetirim?

Bu biraz uzun ama benim kod karışıklık göstermek için örnek lazım. Aşağıdaki cevap için ilgileniyorum sonra:

  1. Nasıl require('module') yerine require('../../src/module') require('./module') kullanabilirim?
  2. Nasıl iş çoğaltmadan spec/specs.js 9 *yeniden muyum? (Giriş modülü olarak çalışan src/app.js önleyici).

Zaten tarayıcı tabanlı çeşitli projeler başladım ve browserify aşk ve homurtu. Ama her proje geliştirme/benim öğrenme eğrisi aynı noktada ölür. Ben karıştırmak için test eklemek ve bütün sistem çöker browserify iki demetleri (app.js spec/specs.js) yönetmek için bir kez. Açıklayayım:

grunt-browserify kullanıyorum ve benim ilk dizin:

.
├── Gruntfile.js
├── index.js  (generated via grunt-browserify)      [1]
├── lib
│   ├── jquery
│   │   └── jquery.js                               [2]
│   └── jquery-ui
│       └── jquery-ui.js                            [3]
├── spec
│   ├── specs.js  (generated via grunt-browserify)  [4]
│   └── src
│       ├── spec_helper.js  (entry)
│       └── module_spec.js  (entry)
└── src
    ├── app.js  (entry)
    └── module.js
  1. Kullanan bir kayıt (src/app.js) dosya ve paket için kod bir yürüyüş yapargereklimodüller.
  2. Kullanır browserify-shim diğer jquery.
  3. Sadece bir dolgu (18 ** sonra gerekli) olmadan jquery-ui sağlanır.
  4. Giriş modülleri spec/src tüm yardımcı ve spec dosyaları kullanır.

Benim adım config vereceğim:

browserify: {
  dist: {
    files: {
      'index.js': ['src/app.js']
    }
  }
}

// in app.js
var MyModule = require('./module'); // <-- relative path required?!

Mutlu

Şimdi eklemek jquery:

browserify: {
  options: {
    shim: {
      jquery: {
        path: 'lib/jquery/jquery.js',
        exports: '$'
      }
    },
    noParse: ['lib/**/*.js'],
    alias: [
      'lib/jquery-ui/jquery-ui.js:jquery-ui'
    ]
  },
  dist: {
    files: {
      'index.js': ['src/app.js']
    }
  }
}

// in app.js
var $ = require('jquery');
require('jquery-ui');
var MyModule = require('./module');

Mutlu

Şimdi Ekle özellikleri:

options: {
  shim: {
    jquery: {
      path: 'lib/jquery/jquery.js',
      exports: '$'
    }
  },
  noParse: ['lib/**/*.js'],
  alias: [
    'lib/jquery-ui/jquery-ui.js:jquery-ui'
  ]
},
dist: {
  files: {
    'app.js': 'src/app.js'
  }
},
spec: {
  files: {
    'spec/specs.js': ['spec/src/**/*helper.js', 'spec/src/**/*spec.js']
  }
}

// in app.js
var $ = require('jquery');
require('jquery-ui');
var MyModule = require('./module');

// in spec/src/module_spec.js
describe("MyModule", function() {
  var MyModule = require('../../src/module'); // <-- This looks like butt!!!
});

Üzücü

Özetlemek gerekirse: ama Nasıl?

  1. require('../../src/module') require('./module') yerine require('module') kullan?
  2. iş çoğaltmadan spec/specs.js 26 *yeniden? (Giriş modülü olarak çalışan src/app.js önleyici).

CEVAP
12 Mayıs 2014, PAZARTESİ


Basit cevap:

Browserify paths seçeneği kullanmak için basit. Büyük bir başarı ile birkaç ay için kullanıyorum. Hatta bu özelliği kullanan bir başlangıç kiti yaptım: https://github.com/stample/gulp-browserify-react-phonegap-starter

var b = browserify('./app', {paths: ['./node_modules','./src/js']});

yollar gerektirir.dizi için kullanın, hiçbir şey yokmuş yollar normal bulundu node_modules özyinelemeli yürüme mesafesinde

Eğer src/js/modulePath/myModule.js bir dosya varsa, bu size require("myModule") her yere yazalım, daha ziyade require("modulePath/myModule") diğer kaynak dosyaları herhangi birinden olmaz.

Seçeneği kaldırılmış mı?

O kadar da zor değilmiş!

Browserify modül çözünürlüğü algoritması resolution algorithm in NodeJSaynalar. Browserify paths seçeneği böylece NodeJS NODE_PATH env değişkeni davranışların aynasıdır. Browserify yazar (substack) NODE_PATH seçeneği NodeJS ile yazıldı ve böylece de Browserify kaldırılmış ve sonraki sürümlerinde kaldırılmış olabilir bu YÜZDEN konu iddia ediyor.

Bu iddia ile aynı fikirde değilim.

NODE_PATH belgelerine bakın. Seçeneği önerilmiyor elbette yapacaktır. Ancak hala substack iddiası doğru mu ilginç bir söz vardır:

Son derece yerel olarak senin bağımlılıkları yer için teşvik edilir node_modules klasörler. Daha hızlı, daha güvenilir ve daha dolu olacaktır.

Ve this question E-posta listesine 2012'de kaydedildi.

Oliver Leics: is NODE_PATH deprecated? 
Ben Noordhuis (ex core NodeJS contributor): No. Why do you ask? 

Ve eğer bir şey NodeJS çözüm algoritması kaldırılırsa değil, yakın zamanda Browserify:) kaldırılacaktır sanmıyorum

Sonuç

Ya paths seçeneğini kullanın ya da resmi belgeleri Browserify author recommends gibi node_modules kodunuzu girebilirsiniz.

Şahsen, ben fikrimi söyledim sadece kaynak kontrolüm dışında tüm bu klasörü tutmak node_modules benim kendi kod koymak hoşuma gitmiyor. Birkaç ay için paths seçeneği şimdi kullanıyorum ve herhangi bir sorun yoktu, ve inşa hızım oldukça iyidir.

İçinde bir sembolik bağ koyarak substack çözüm node_modules kullanışlı olabilir ama ne yazık ki geliştiriciler Windows ile çalışıyor

Ancak var sanırımpaths seçeneği kullanmak istemediğiniz bir durumbir kütüphane etmesinin önünü bir depo yayınlanan gelişen zaman diğer uygulamalar tarafından gerekli olacaktır. Gerçekten bu kitaplığı istemcileri göreli yol cehennem önlemek için lib sizi istiyor diye, özel inşa config kurulum istemez.

Başka bir olası seçenek remapify kullanmaktır

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AutoklubZAPRESIC

    AutoklubZAPR

    17 Mayıs 2011
  • Phandroid

    Phandroid

    26 Ocak 2009
  • Samantha Crain

    Samantha Cra

    30 EKİM 2008