Moment.js dosyasının yerel paketi web paketiyle yüklemesini nasıl önleyebilirim?


199

moment.jsWeb paketini kullanırken tüm yerel ayarları yüklemeyi bırakabilmenin herhangi bir yolu var mı (sadece İngilizce'ye ihtiyacım var)? Kaynağa bakıyorum ve hasModulewebpack için tanımlanmışsa, her zaman require()her yerel ayar için çalışıyor gibi görünüyor . Bunun düzeltilmesi için bir çekme isteğine ihtiyacı olduğundan eminim. Ancak bunu webpack yapılandırmasıyla çözebilmemizin bir yolu var mı?

İşte momentjs yüklemek için benim webpack yapılandırma:

resolve: {
            alias: {
                moment: path.join(__dirname, "src/lib/bower/moment/moment.js")
            },
        },

O zaman ihtiyacım olan her yerde, sadece yapıyorum require('moment'). Bu işe yarıyor, ancak paketimize yaklaşık 250 kB gereksiz dil dosyası ekliyor. Ayrıca momentjs ve yutkunluk versiyonunu kullanıyorum.

Ayrıca bu webpack config tarafından düzeltilemezse, burada yerel ayarları yüklediği işleve bir bağlantı bulunur . Ben ekleyerek çalıştı && module.exports.loadLocalesetmek ifdeyimi ama webpack bu işe yarar bir şekilde aslında iş yapmaz sanırım. Ne requireolursa olsun. Bence şimdi bir normal ifade kullanıyor, bu yüzden düzeltmeyi nasıl yapacağınızı gerçekten bilmiyorum.


nmpBunun yerine anı kullanmayı denediniz bowermi?
Andreas Köberle

Tüm müşteri kütüphanelerim için bower ve tüm oluşturma aletlerim için npm kullanıyorum. Projelerimin nasıl düzenlendiğinden dolayı bu şekilde tutmak istiyorum. Ayrıca github.com/moment/moment/issues/1866 son yanıt bakarsanız Kendi sorunumu çözdüm ama küçük bir kaynak düzenleme gerektirir. Düğüm ve webpack arasında nasıl ayrım yapacağınızı bilmediğim için bunu nasıl doğru şekilde yapacağımı hala bilmiyorum.
epelc

Yanıtlar:


305

Kod require('./locale/' + name), localedir içindeki her dosyayı kullanabilir . Böylece webpack her dosyayı paketinizde modül olarak içerir. Hangi dili kullandığınızı bilemez.

Web paketinize, paketinize hangi modülün dahil edilmesi gerektiği hakkında daha fazla bilgi vermek için yararlı olan iki eklenti vardır: ContextReplacementPluginve IgnorePlugin.

require('./locale/' + name)bir bağlam (bir ifade içeren bir istek) olarak adlandırılır. webpack bu kod parçasından bazı bilgiler alır: Bir dizin ve normal bir ifade. Buraya: directory = ".../moment/locale" regular expression = /^.*$/. Bu nedenle, varsayılan olarak localedizindeki her dosya dahil edilir.

ContextReplacementPluginYani yeni bir düzenli ifade (dahil etmek istediğiniz dilleri seçmek için) sağlamak anlaşılmaktadır bilgileri geçersiz kılmak için izin verir.

Diğer bir yaklaşım ise ile olan ihtiyacı görmezden gelmektir IgnorePlugin.

İşte bir örnek:

var webpack = require("webpack");
module.exports = {
  // ...
  plugins: [
    new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /de|fr|hu/)
    // new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
  ]
};

3
Yoksay yükleyicinin nasıl kullanılacağını açıklayabilir misiniz? `` Yeni webpackreg.IgnorePlugin (/\.\/ locale \ /.+. Js $ /, []) `denedim ama işe yaramadı. Ayrıca contextReplacementPlugin hala benim paketteki dosyaları dahil Ben sadece onları kullanmadığını düşünüyorum.
epelc

9
Moment + webpack hakkında ayrıntılı bir tartışma içeren bu konuya ( github.com/webpack/webpack/issues/198 ) bir göz atabilirsiniz.
Tobias K.

2
Bence teşekkür ederiz new webpack.IgnorePlugin(/^\.\/lang$/, /moment$/)çalışacak github üzerinde yorum yapmaktan.
epelc

16
Web paketi dokümanlarında, ikinci argüman bir dizi normal ifadedir. Denedim plugins: [ new webpack.IgnorePlugin(/^\.\/locale$/, [/moment$/]) ],sadece para cezası çalıştığı.
Alex K

6
Köşeli parantez @AlexKinnee dokümanlar içinde isteğe bağlı bir bağımsız değişken değil, bir dizi anlamına gelir.
yangmillstheory

8

Projemize anı şu şekilde dahil ediyorum: import moment from 'moment/src/moment';ve bu hile yapıyor gibi görünüyor. Anı kullanmamız çok basit, bu yüzden SDK ile herhangi bir tutarsızlık olup olmayacağından emin değilim. WebPack yerel dosyaları statik olarak nasıl bulacağını bilmediği için bu işe yaradığını düşünüyorum, bu yüzden bir uyarı (boş bir klasör ekleyerek gizlemek kolaydır moment/src/lib/locale/locale) ama hiçbir yerel ayar içerir.


1
Bunun sizin için nasıl çalıştığından emin değilim ... Sadece github.com/angular/angular-cli/issues/6137 ile savaşmaya çalıştım ve sonra github.com/ksloan/moment-mini kullanarak bitirdim . Uygun modüler momentkütüphane bir noktada Sürüm 3 github.com/moment/moment/milestone/15 ile gelecektir .
kuncevic.dev


2

Adam McCrmick'in cevabına dayanarak, yakındınız, takma adınızı şu şekilde değiştirin:

resolve: {
    alias: {
        moment: 'moment/src/moment'
    },
},

1
Bu, eklediğiniz tüm modüllerin davranışını değiştireceğine ve üçüncü taraf kitaplıklarıyla ilginç sorunlara neden olabileceğine dair bir uyarı. Genel olarak çalışması gerekir
Adam McCormick

1
Detaylandırabilir misin? Tüm takma ad kullanım durumlarında deneyimli değilim. Anladığım kadarıyla, sadece bu modüle dokunursanız önemli olurdu, bu durumda 'an'
bigopon

3
Çözüm takma adları ayarladığınızda, bunlar sisteminizdeki herhangi bir içe aktarma veya gereksinim kullanımı (bağımlı olduğunuz kitaplıklar dahil) için geçerlidir. Dolayısıyla, gerekli ana bağlı olduğunuz bir modül, o modülün sonucunu da değiştirirsiniz. Bağımlılık ağacınızdaki bir düğüm modülüyle çakışan bir diğer ad belirlerseniz (örneğin, bağımlılıklarınız bu kitaplığı kullanıyorsa) ortaya çıkar. Uygulamada, sadece isim çatışmalarıyla ilgili bir sorunum vardı, böyle davranış geliştirmeleriyle değil, bu bir ithalat ifadesini değiştirmekten daha tehlikeli bir yaklaşım.
Adam McCormick

2

İle webpack2yapabileceğiniz anın son sürümleri ve:

import {fn as moment} from 'moment'

Ve sonra webpack.config.jssende:

resolve: {
    packageMains: ['jsnext:main', 'main']
}

1
Sanırım demek istedinmainFields: ...
Guillermo Grau

Alan adının değiştiğinden emin olarak webpack2'ye bakın.
Kevin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.