¿Hay alguna forma de evitar que moment.jscargue todos los entornos locales (solo necesito inglés) cuando usa webpack? Estoy mirando la fuente y parece que si hasModuleestá 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.loadLocalesa la ifdeclaración, pero supongo que webpack no funciona de una manera que funcionaría. Simplemente requireno importa qué. Creo que ahora usa una expresión regular, así que realmente no sé cómo podrías arreglarlo.
fuente

nmplugar debower?Respuestas:
El código
require('./locale/' + name)puede usar todos los archivos en ellocaledirectorio. 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:
ContextReplacementPluginyIgnorePlugin.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
ContextReplacementPluginpermite 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
momentbiblioteca modular adecuada presentará la Versión 3 github.com/moment/moment/milestone/15 en algún momento.La
momentbiblioteca modular adecuada presentará la Versión 3 en algún momento, por lo que actualmente estoy usando angular-cli sin--ejecthaber 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
webpack2y versiones recientes de moment puedes hacer:Y luego en
webpack.config.jsti haces:fuente
mainFields: ...