share_this_document plugin page htmlwebpackplugin doc_page cannot body app javascript coffeescript webpack babeljs

javascript - plugin - webpack html css



¿Cómo agregar una consulta a un cargador de paquetes web con múltiples cargadores? (4)

En webpack 2 y 3 esto se puede configurar de manera mucho más limpia.

Los cargadores se pueden pasar en una matriz de objetos del cargador. Cada objeto del cargador puede especificar un objeto de options que actúa como la query del paquete web 1 para ese cargador en particular.

Por ejemplo, usando react-hot-loader y babel-loader , con babel-loader configurado con algunas opciones, en webpack 2 y 3

module: { rules: [{ test: //.js$/, exclude: /node_modules/, use: [{ loader: ''react-hot-loader'' }, { loader: ''babel-loader'', options: { babelrc: false, presets: [ ''es2015-native-modules'', ''stage-0'', ''react'' ] } }] }] }

A modo de comparación, aquí está la misma configuración en el paquete web 1 , utilizando el método de cadena de consulta.

module: { loaders: [{ test: //.js$/, exclude: /node_modules/, loaders: [ ''react-hot'', ''babel-loader?'' + ''babelrc=false,'' + ''presets[]=es2015,'' + ''presets[]=stage-0,'' + ''presets[]=react'' ] }] }

Observe los nombres de propiedad modificados en toda la cadena.

Además, tenga en cuenta que cambié el preajuste es2015 preestablecido es2015-native-modules en la configuración de babel-loader . Esto no tiene nada que ver con la especificación de options , es solo que incluir módulos es6 le permite usar la función de sacudida de árbol introducida en v2. Podría dejarse solo y seguiría funcionando, pero la respuesta se sentiría incompleta sin que se indique esa actualización obvia :-)

Tengo este cargador Babel que funciona

{ test: //.jsx?$/, loader: ''babel'', query: babelSettings, exclude: /node_modules/ },

Pero ahora quiero un cargador CoffeeScript, pero quiero canalizarlo a través de Babel para obtener las cosas elegantes de HMR

{ test: //.coffee$/, loader: ''babel!coffee'', query: babelSettings, exclude: /node_modules/ },

Sin embargo, esto no funciona y da como resultado el siguiente error.

Error: no se puede definir ''consulta'' y múltiples cargadores en la lista de cargadores

¿Alguna idea de cómo definir la consulta solo para la parte de Babel de la cadena de cargadores? La consulta es un objeto complicado y no creo que pueda codificarlo.

var babelSettings = { stage: 0 }; if (process.env.NODE_ENV !== ''production'') { babelSettings.plugins = [''react-transform'']; babelSettings.extra = { ''react-transform'': { transforms: [{ transform: ''react-transform-hmr'', imports: [''react''], locals: [''module''] }, { transform: ''react-transform-catch-errors'', imports: [''react'', ''redbox-react''] }] // redbox-react is breaking the line numbers :-( // you might want to disable it } }; }


La propiedad de test es solo regex, por lo que puede ejecutar una comprobación para jsx y café al mismo tiempo: test: //.(jsx|coffee)$/

Sass / SCSS es un poco más fácil: test: //.s[ac]ss$/


Sokra, el creador de Webpack, da su propia opinión sobre cómo hacer esto here , pero probablemente será mejor servido con el ayudante de webpack-combine-loaders que es más similar en estilo a la definición de un solo cargador con el objeto de consulta.

Con webpack-combine-loaders , puede definir múltiples cargadores como tales:

combineLoaders([ { loader: ''css-loader'', query: { modules: true, sourceMap: true, localIdentName: ''[name]__[local]--[hash:base64:5]'', }, }, { loader: ''sass-loader'', query: { sourceMap: true, includePaths: [ ''app/assets/stylesheets'', ''app/assets/stylesheets/legacy'', ], }, }, ]);


Actualización: con versiones no heredadas de Webpack , puede definir una matriz de cargadores en la configuración de Webpack .

Si necesita usar versiones anteriores de Webpack o agregar las opciones en línea, la respuesta original se encuentra a continuación.

La forma de hacerlo es establecer los parámetros de consulta en la cadena del cargador, ya que la clave del objeto de query solo funcionará para un cargador.

Suponiendo que su objeto de configuración se puede serializar a JSON, como lo indica su ejemplo, puede pasar fácilmente su objeto de configuración como una consulta JSON. Entonces solo el cargador de Babel obtendrá la configuración.

{ test: //.coffee$/, loader: ''babel?''+JSON.stringify(babelSettings)+''!coffee'', exclude: /node_modules/ }

La característica para hacer esto está algo documentada aquí:

Uso de cargadores: parámetros de consulta

La mayoría de los cargadores aceptan parámetros en el formato de consulta normal ( ?key=value&key2=value2 ) y como objeto JSON ( ?{"key":"value","key2":"value2"} ).