Apakah ada cara Anda bisa berhenti moment.js
memuat semua lokal (saya hanya perlu bahasa Inggris) ketika Anda menggunakan webpack? Saya melihat sumbernya dan tampaknya jika hasModule
didefinisikan, yang untuk webpack, maka ia selalu mencoba ke require()
setiap lokal. Saya cukup yakin ini membutuhkan permintaan tarik untuk memperbaikinya. Tetapi apakah ada cara kita dapat memperbaikinya dengan konfigurasi webpack?
Ini konfigurasi webpack saya untuk memuat momentjs:
resolve: {
alias: {
moment: path.join(__dirname, "src/lib/bower/moment/moment.js")
},
},
Lalu di mana pun saya membutuhkannya, saya lakukan saja require('moment')
. Ini berfungsi tetapi ia menambahkan sekitar 250 kB file bahasa yang tidak dibutuhkan ke bundel saya. Saya juga menggunakan versi bower dari momentjs dan tegukan.
Juga jika ini tidak dapat diperbaiki oleh konfigurasi webpack di sini adalah tautan ke fungsi tempat memuat lokal . Saya mencoba menambahkan && module.exports.loadLocales
ke if
pernyataan tapi saya kira Webpack tidak benar-benar bekerja dengan cara di mana yang akan bekerja. Tidak require
peduli apa. Saya pikir itu menggunakan regex sekarang jadi saya tidak benar-benar tahu bagaimana Anda akan memperbaikinya.
sumber
nmp
alih-alihbower
?Jawaban:
Kode
require('./locale/' + name)
dapat menggunakan setiap file dalamlocale
direktori. Jadi webpack menyertakan setiap file sebagai modul dalam bundel Anda. Tidak dapat mengetahui bahasa yang Anda gunakan.Ada dua plugin yang berguna untuk memberi webpack lebih banyak informasi tentang modul mana yang harus dimasukkan dalam bundel Anda:
ContextReplacementPlugin
danIgnorePlugin
.require('./locale/' + name)
disebut konteks (persyaratan yang berisi ekspresi). webpack menyimpulkan beberapa informasi dari fragmen kode ini: Direktori dan ekspresi reguler. Di sini:directory = ".../moment/locale"
regular expression = /^.*$/
. Jadi secara default setiap file dalamlocale
direktori disertakan.The
ContextReplacementPlugin
memungkinkan untuk menimpa informasi disimpulkan yaitu memberikan ekspresi reguler baru (untuk memilih bahasa yang ingin Anda sertakan).Pendekatan lain adalah mengabaikan kebutuhan dengan
IgnorePlugin
.Berikut ini sebuah contoh:
sumber
new webpack.IgnorePlugin(/^\.\/lang$/, /moment$/)
dari komentar Anda pada github akan berhasil.plugins: [ new webpack.IgnorePlugin(/^\.\/locale$/, [/moment$/]) ],
yang bekerja dengan baik.Dalam proyek kami, saya sertakan momen seperti ini:
import moment from 'moment/src/moment';
dan itu sepertinya berhasil. Penggunaan momen kami sangat sederhana, jadi saya tidak yakin apakah akan ada inkonsistensi dengan SDK. Saya pikir ini berfungsi karena WebPack tidak tahu bagaimana menemukan file lokal secara statis, sehingga Anda mendapatkan peringatan (mudah disembunyikan dengan menambahkan folder kosong dimoment/src/lib/locale/locale
) tetapi tidak ada lokal yang menyertakan.sumber
moment
Pustaka modular yang tepat akan hadir dengan Versi 3 github.com/moment/moment/milestone/15 di beberapa titik.moment
Pustaka modular yang tepat akan muncul dengan Versi 3 di beberapa titik jadi saat ini karena saya menggunakan angular-cli tanpa--eject
saya baru saja menggunakan https://github.com/ksloan/moment-mini sepertiimport * as moment from 'moment-mini';
sumber
Berdasarkan jawaban Adam McCrmick, Anda sudah dekat, ubah alias Anda menjadi:
sumber
Dengan
webpack2
dan versi terbaru dari momen yang dapat Anda lakukan:Dan kemudian dalam diri
webpack.config.js
Anda lakukan:sumber
mainFields: ...