J'utilise moment dans un build webpack.
Il semble que require('moment')
soit l'équivalent d'utiliser moment-with-locales.min.js
de CDN (à en juger principalement par l'augmentation de la taille de mon forfait).
Existe-t-il un moyen d'exiger un moment avec uniquement les paramètres régionaux anglais par défaut ? (c'est-à-dire l'équivalent de moment.min.js
de CDN).
Je suppose que ma question est liée au #2373
Je viens de rencontrer le même problème que vous avec webpack. Cet article SO couvre 2 manières différentes d'éviter d'empaqueter les paramètres régionaux : http://stackoverflow.com/a/25426019/239965
Le IgnorePlugin
fait le travail pour moi :
plugins: [
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
]
Très cool, merci @balexand
L'IgnorePlugin fait le travail, je suis descendu à 11 ko gzippé lors de l'ajout de moment.
Ce serait quand même bien d'avoir la possibilité d'exiger avec ou sans locales . Fermeture de celui-ci, car il existe déjà le #2373
Selon ce commentaire , il devrait y avoir un moment sans locales sur npmjs.
ce module expose le moment sans les locales https://github.com/ksloan/moment-mini
En utilisant moment
avec angular-cli
, l'ensemble des paramètres régionaux s'est retrouvé dans mon bundle.
Comme je n'utilise pas --eject
signalez celui-ci https://github.com/moment/moment/issues/2416#issuecomment -111713308 pour qu'il ne fonctionne pas pour moi. Existe-t-il une solution avec angular-cli
pour exclure les paramètres régionaux ?
@balexand Merci, ça marche pour moi
Si quelqu'un omet de taper, voici mon fork :
https://github.com/kirillgroshkov/moment-mini-ts
npm i moment-mini-ts
import * as moment from 'moment-mini-ts'
Que diriez-vous d'ignorer tous les paramètres régionaux avec IgnorePlugin, sauf certains de mon choix ? Par exemple, ignorez tout sauf EN, ES, FR. Est-ce possible avec une expression régulière ?
plugins: [
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
]
Edit: j'ai compris, au cas où quelqu'un en aurait encore besoin. Trouvé dans https://stackoverflow.com/a/25426019/2477303
plugins: [
new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en|es|fr/),
// new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
]
@kuncevic , avez-vous réussi à exclure locale
avec angular-cli
?
Je sais que c'est un peu bidon, mais pour nos projets, nous avons créé un fichier moment-angular-cli-patch.js
avec le contenu suivant :
'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.' );
}
} );
Le script ci-dessus ignore toutes les locales à l'exception de l'allemand, et il est écrit spécifiquement pour @angular/cli 1.5.0
(d'autres versions devront peut-être être gérées différemment). Dans nos fichiers package.json
, nous l'avons ajouté aux scripts :
"scripts": {
"postinstall": "node ./moment-angular-cli-patch.js"
}
Pas une bonne solution mais une solution qui fonctionne...
@dominique-mueller c'est une idée intéressante, merci pour le partage
@dominique-mueller Pour l'instant, c'est une idée intéressante, merci
@dominique-mueller merci pour l'idée ! J'ai fini par patcher le moment au lieu du cli angulaire.
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 idée intéressante mais je ne pense pas que patcher la configuration interne du webpack de l'angular-cli soit une bonne idée à long terme, étant donné que le patch dépendrait vraiment des versions angular-cli et vous le feriez ' t être en mesure de mettre à jour très facilement. Il en va de même pour le patch dans la config du moment.
La solution idéale serait qu'angular ouvre sa configuration webpack afin que nous puissions ajouter des plugins ou un moment pour nous donner une option pour ne pas avoir autant de choses inutilisées dans notre bundle
En plus du commentaire de
plugins: [
new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /(en|es|fr)$/),
]
De cette façon, vous n'obtenez pas toutes les es-*
locales comme es-do
, es-us
et ainsi de suite.
En fait, sans ce changement, vous vous retrouvez avec 13 locales au lieu de 3 à cause de toutes les variations régionales.
Avec ngx-build-plus, vous devriez pouvoir ajuster la configuration Webpack dans Angular CLI sans éjecter.
@SamVerschueren C'EST INCROYABLE
Comment puis-je ignorer quelques répertoires de mes modules ? Comme mon projet est énorme et qu'il donne pendant la construction de la production, je pense donc construire des morceaux par morceaux, donc devrai-je ignorer/exclure quelques répertoires ? S'il vous plaît aider son peu urgent. Merci d'avance.
existe-t-il une mise à jour utilisant les meilleures pratiques ? Je vois qu'un problème récent fait à nouveau référence à ce correctif https://github.com/urish/ngx-moment/issues/212
Commentaire le plus utile
Je viens de rencontrer le même problème que vous avec webpack. Cet article SO couvre 2 manières différentes d'éviter d'empaqueter les paramètres régionaux : http://stackoverflow.com/a/25426019/239965
Le
IgnorePlugin
fait le travail pour moi :