Estou usando o momento em uma construção de webpack.
Parece que require('moment')
é o equivalente a usar moment-with-locales.min.js
do CDN (a julgar principalmente pelo aumento de tamanho em meu pacote).
Existe uma maneira de exigir o momento apenas com o locale inglês padrão? (ou seja, o equivalente a moment.min.js
do CDN).
Acho que minha pergunta está relacionada a # 2373
Acabei de ter o mesmo problema que você com o webpack. Esta postagem do SO cobre 2 maneiras diferentes de evitar empacotar as localidades: http://stackoverflow.com/a/25426019/239965
O IgnorePlugin
fez o trabalho por mim:
plugins: [
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
]
Muito legal, obrigado @balexand
O IgnorePlugin faz o trabalho, estou com 11kb gzipado ao adicionar momento.
Ainda assim, seria bom ter a opção de exigir com localidades ou sem localidades . Fechando este, pois já existe o # 2373
De acordo com este comentário , deve haver um momento sem localidades em npmjs.
este módulo expõe o momento sem as localidades https://github.com/ksloan/moment-mini
Usando moment
com angular-cli
, toda a localidade acabou no meu pacote.
Como não estou usando --eject
sinalize este https://github.com/moment/moment/issues/2416#issuecomment -111713308 por não funcionar para mim. Existe alguma solução com angular-cli
para excluir o local?
@balexand Obrigado, funciona para mim
Se alguém perder a digitação, aqui está o meu garfo:
https://github.com/kirillgroshkov/moment-mini-ts
npm i moment-mini-ts
import * as moment from 'moment-mini-ts'
Que tal ignorar todos os locais com IgnorePlugin, exceto alguns de minha escolha? Por exemplo, ignore tudo exceto EN, ES, FR. Isso pode ser feito com uma expressão regular?
plugins: [
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
]
Edit: Eu descobri, caso alguém ainda precise. Encontrado em https://stackoverflow.com/a/25426019/2477303
plugins: [
new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en|es|fr/),
// new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
]
@kuncevic , você conseguiu excluir locale
com angular-cli
?
Eu sei que é meio hacky, mas para nossos projetos, criamos um arquivo moment-angular-cli-patch.js
com o seguinte conteúdo:
'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.' );
}
} );
O script acima ignora todos os locais, exceto alemão, e foi escrito especificamente para @angular/cli 1.5.0
(outras versões podem precisar ser tratadas de forma diferente). Em nossos arquivos package.json
, nós o adicionamos aos scripts:
"scripts": {
"postinstall": "node ./moment-angular-cli-patch.js"
}
Não é uma ótima solução, mas uma solução que funciona ...
@ dominique-mueller que ideia interessante, obrigado por compartilhar
@ dominique-mueller Por agora é uma ideia interessante, obrigado
@ dominique-mueller obrigado pela ideia! No entanto, acabei remendando o momento em vez do cli angular.
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 ideia interessante, mas não acho que corrigir a configuração interna do webpack do angular-cli seja uma boa ideia a longo prazo, visto que o patch seria realmente dependente das versões do angular-cli e você não o faria t ser capaz de atualizar realmente facilmente. O mesmo vale para o patch na configuração do momento.
A solução ideal seria o angular abrir sua configuração do webpack para que possamos adicionar plug-ins ou um momento para nos dar a opção de não ter tantas coisas não utilizadas em nosso pacote
Além do comentário de @fergardi , alterar levemente o regex evita incluir mais alguns locais indesejados.
plugins: [
new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /(en|es|fr)$/),
]
Desta forma, você não obtém todos os es-*
locais como es-do
, es-us
e assim por diante.
Na verdade, sem essa alteração, você acaba com 13 localidades em vez de 3 por causa de todas as variações regionais.
Com o ngx-build-plus, você deve ser capaz de ajustar a configuração do Webpack no Angular CLI sem ejetar.
@SamVerschueren ISTO É INCRÍVEL 😸
Como posso ignorar alguns diretórios de meus módulos? Como meu projeto é enorme e está dando while prod build, então estou pensando em construir chunks por chunks então precisarei ignorar / excluir alguns diretórios? Por favor, ajude é um pouco urgente. Desde já, obrigado.
existe uma atualização para isso que usa as práticas recomendadas? Vejo que um problema recente referenciou essa correção novamente https://github.com/urish/ngx-moment/issues/212
Comentários muito úteis
Acabei de ter o mesmo problema que você com o webpack. Esta postagem do SO cobre 2 maneiras diferentes de evitar empacotar as localidades: http://stackoverflow.com/a/25426019/239965
O
IgnorePlugin
fez o trabalho por mim: