¿Hay alguna forma de evitar que moment.js
cargue todos los entornos locales (solo necesito inglés) cuando usa webpack? Estoy mirando la fuente y parece que si hasModule
está definido, que es para webpack, siempre trata de require()
cada configuración regional. Estoy bastante seguro de que esto necesita una solicitud de extracción para solucionarlo. Pero, ¿hay alguna forma de solucionar esto con la configuración del paquete web?
Aquí está mi configuración de paquete web para cargar momentjs:
resolve: {
alias: {
moment: path.join(__dirname, "src/lib/bower/moment/moment.js")
},
},
Luego, donde sea que lo necesite, lo hago require('moment')
. Esto funciona pero agrega alrededor de 250 kB de archivos de idiomas innecesarios a mi paquete. También estoy usando la versión Bower de momentjs y trago.
Además, si esto no puede ser solucionado por la configuración del paquete web, aquí hay un enlace a la función donde carga las configuraciones regionales . Traté de agregar && module.exports.loadLocales
a la if
declaración, pero supongo que webpack no funciona de una manera que funcionaría. Simplemente require
no importa qué. Creo que ahora usa una expresión regular, así que realmente no sé cómo podrías arreglarlo.
fuente
nmp
lugar debower
?Respuestas:
El código
require('./locale/' + name)
puede usar todos los archivos en ellocale
directorio. Entonces webpack incluye cada archivo como módulo en su paquete. No puede saber qué idioma está utilizando.Hay dos complementos que son útiles para dar a webpack más información sobre qué módulo debe incluirse en su paquete:
ContextReplacementPlugin
yIgnorePlugin
.require('./locale/' + name)
se llama contexto (un requisito que contiene una expresión). webpack infiere alguna información de este fragmento de código: un directorio y una expresión regular. Aquí:directory = ".../moment/locale"
regular expression = /^.*$/
. Entonces, de manera predeterminadalocale
, se incluyen todos los archivos del directorio.El
ContextReplacementPlugin
permite sustituir la información inferida es decir, proporcionar una nueva expresión regular (a elegir los idiomas que desea incluir).Otro enfoque es ignorar el requerimiento con el
IgnorePlugin
.Aquí hay un ejemplo:
fuente
new webpack.IgnorePlugin(/^\.\/lang$/, /moment$/)
tu comentario sobre github funcionará.plugins: [ new webpack.IgnorePlugin(/^\.\/locale$/, [/moment$/]) ],
que funcionó bien.En nuestro proyecto, incluyo momentos como este:
import moment from 'moment/src/moment';
y eso parece ser el truco. Sin embargo, nuestro uso del momento es muy simple, por lo que no estoy seguro de si habrá inconsistencias con el SDK. Creo que esto funciona porque WebPack no sabe cómo encontrar los archivos locales de forma estática, por lo que recibe una advertencia (que es fácil de ocultar al agregar una carpeta vacía enmoment/src/lib/locale/locale
), pero no incluye la configuración regional.fuente
moment
biblioteca modular adecuada presentará la Versión 3 github.com/moment/moment/milestone/15 en algún momento.La
moment
biblioteca modular adecuada presentará la Versión 3 en algún momento, por lo que actualmente estoy usando angular-cli sin--eject
haber terminado de usar https://github.com/ksloan/moment-mini comoimport * as moment from 'moment-mini';
fuente
Según la respuesta de Adam McCrmick, estabas cerca, cambia tu alias a:
fuente
Con
webpack2
y versiones recientes de moment puedes hacer:Y luego en
webpack.config.js
ti haces:fuente
mainFields: ...