Saya menggunakan momen dalam build webpack.
Sepertinya require('moment')
setara dengan menggunakan moment-with-locales.min.js
dari CDN (dilihat terutama dari peningkatan ukuran bundel saya).
Apakah ada cara untuk meminta momen hanya dengan lokal bahasa Inggris default? (yaitu setara dengan moment.min.js
dari CDN).
Saya kira pertanyaan saya terkait dengan #2373
Saya baru saja mengalami masalah yang sama seperti Anda dengan webpack. Posting SO ini mencakup 2 cara berbeda untuk menghindari pengemasan lokal: http://stackoverflow.com/a/25426019/239965
IgnorePlugin
melakukan pekerjaan untuk saya:
plugins: [
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
]
Sangat keren, terima kasih @balexand
IgnorePlugin melakukan pekerjaan itu, saya turun ke 11kb gzip saat menambahkan momen.
Masih akan menyenangkan untuk memiliki opsi untuk meminta dengan lokal atau tanpa lokal . Menutup yang ini, karena sudah ada #2373
Menurut komentar ini , seharusnya ada momen tanpa lokal di npmjs.
modul ini mengekspos momen tanpa lokal https://github.com/ksloan/moment-mini
Menggunakan moment
dengan angular-cli
sehingga seluruh lokal berakhir di bundel saya.
Karena saya tidak menggunakan tanda --eject
ini https://github.com/moment/moment/issues/2416#issuecomment -111713308 tidak berfungsi untuk saya. Apakah ada solusi dengan angular-cli
untuk mengecualikan lokal?
@balexand Terima kasih, ini berhasil untuk saya
Jika seseorang melewatkan pengetikan, inilah garpu saya:
https://github.com/kirillgroshkov/moment-mini-ts
npm i moment-mini-ts
import * as moment from 'moment-mini-ts'
Bagaimana dengan mengabaikan semua lokal dengan IgnorePlugin kecuali beberapa pilihan saya? Misalnya, abaikan semua kecuali EN, ES, FR. Bisakah itu dilakukan dengan ekspresi reguler?
plugins: [
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
]
Sunting: Saya menemukan jawabannya, kalau-kalau seseorang masih membutuhkannya. Ditemukan di https://stackoverflow.com/a/25426019/2477303
plugins: [
new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en|es|fr/),
// new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
]
@kuncevic , apakah Anda berhasil mengecualikan locale
dengan angular-cli
?
Saya tahu ini semacam peretasan, tetapi untuk proyek kami, kami telah membuat file moment-angular-cli-patch.js
dengan konten berikut:
'use strict';
const fs = require( 'fs' );
console.log( 'Patchin internal Angular CLI configuration ...' );
const webpackProductionConfigPath = './node_modules/@angular/cli/models/webpack-configs/production.js';
fs.readfile( webpackProductionConfigPath, 'utf-8', ( error, fileContent ) => {
const momentFix = 'extraPlugins.push( new webpack.ContextReplacementPlugin( /moment[\\/\\\\]locale$/, /de.js/ ) );';
if ( fileContent.indexOf( momentFix ) === -1 ) {
const uniqueContent = 'return {'; // Line 112
const modifiedFileContent = fileContent.replace( uniqueContent, `${ momentFix }\n ${ uniqueContent }` );
fs.writeFile( webpackProductionConfigPath, modifiedFileContent, 'utf-8', ( error ) => {
console.log( 'Done.' );
} );
} else {
console.log( 'Nothing to do.' );
}
} );
Skrip di atas mengabaikan semua lokal kecuali bahasa Jerman, dan ditulis khusus untuk @angular/cli 1.5.0
(versi lain mungkin perlu ditangani secara berbeda). Dalam file package.json
kami, kami telah menambahkannya ke skrip:
"scripts": {
"postinstall": "node ./moment-angular-cli-patch.js"
}
Bukan solusi yang bagus tetapi solusi yang berhasil ...
@dominique-mueller itu ide yang menarik, terima kasih telah berbagi
@dominique-mueller Untuk saat ini adalah ide yang menarik, terima kasih
@dominique-mueller terima kasih atas idenya! Saya akhirnya menambal momen alih-alih angular cli.
const fs = require('fs');
const filePath = './node_modules/moment/moment.js';
const patch = {
find: 'var aliasedRequire = require;',
replace: 'var aliasedRequire = function(){};'
};
console.log('Patching moment');
let source = fs.readFileSync(filePath);
const index = source.indexOf(patch.find);
if (index === -1) {
console.log('Nothing to do.');
} else {
source = source.toString().replace(patch.find, patch.replace);
fs.writeFileSync(filePath, source, 'utf-8');
console.log('done');
}
@dominique-mueller ide yang menarik tetapi saya tidak berpikir menambal konfigurasi webpack internal dari angular-cli adalah ide yang bagus dalam jangka panjang, mengingat bahwa tambalan akan sangat bergantung pada versi angular-cli dan Anda tidak akan melakukannya. tidak dapat memperbarui dengan sangat mudah. Hal yang sama berlaku untuk tambalan di konfigurasi momen.
Solusi ideal adalah agar angular membuka konfigurasi webpack mereka sehingga kami dapat menambahkan plugin atau momen untuk memberi kami opsi agar tidak memiliki begitu banyak barang yang tidak digunakan dalam bundel kami
Selain komentar @fergardi , sedikit mengubah regex menghindari memasukkan beberapa lokal yang tidak diinginkan.
plugins: [
new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /(en|es|fr)$/),
]
Dengan cara ini Anda tidak mendapatkan semua es-*
lokal seperti es-do
, es-us
dan seterusnya.
Sebenarnya, tanpa perubahan ini Anda akan mendapatkan 13 lokal alih-alih 3 karena semua variasi regional.
Dengan ngx-build-plus Anda harus dapat menyesuaikan konfigurasi Webpack di Angular CLI tanpa mengeluarkan.
@SamVerschueren INI LUAR BIASA
Bagaimana saya bisa mengabaikan beberapa direktori dari modul saya? Karena proyek saya sangat besar dan memberi sementara prod build, jadi saya berpikir untuk membuat potongan demi potongan sehingga perlu Mengabaikan/mengecualikan beberapa direktori? Tolong bantu agak mendesak. Terima kasih sebelumnya.
apakah ada pembaruan untuk ini yang menggunakan praktik terbaik? Saya melihat bahwa masalah baru-baru ini mereferensikan perbaikan ini lagi https://github.com/urish/ngx-moment/issues/212
Komentar yang paling membantu
Saya baru saja mengalami masalah yang sama seperti Anda dengan webpack. Posting SO ini mencakup 2 cara berbeda untuk menghindari pengemasan lokal: http://stackoverflow.com/a/25426019/239965
IgnorePlugin
melakukan pekerjaan untuk saya: