J'ai une variable d'environnement CDN_URL et je souhaite envoyer cette variable dans le fichier SCSS. J'ai aussi essayé prependData de sass-loader.
Je dois utiliser Laravel 5.7, Laravel Mix 4.1.2 et webpack 4.27.1
Erreur: CSS invalide après "... charger les styles" : attendu 1 sélecteur ou at-rule, était "var content = requi"
Voici mon code de fichier 'webpack.mix.js'.
@function asset($type, $file) { @return url('#{$cdn-s3-static-url}#{$asset-base-path}#{$type}/#{$file}'); }
});
Voici mon code de fichier '_functions.scss':
mix.webpackConfig({ module: { rules: [ { test: /\.s[ac]ss$/i, use: [ 'vue-style-loader', 'style-loader', 'css-loader', { loader: 'sass-loader', options: { indentedSyntax: true, prependData: '$cdn-s3-static-url: ' + process.env.CDN_S3_STATIC_URL + ';', }, }, ], }, ], },
3 Réponses :
Vous pouvez injecter des variables d'environnement dans Laravel Webpack Mix en préfixant une clé dans votre fichier .env avec MIX_. Une fois la variable définie dans votre fichier .env, vous pouvez accéder via l'objet process.env
.
Donc, dans votre exemple, vous devez créer une nouvelle variable dans le fichier .env comme MIX_CDN_URL et dans webpack.mix.js
vous pouvez y accéder en utilisant
process.env.MIX_CDN_URL
Vous pouvez sass-loader qui vous permettra d'obtenir les résultats que vous désirez.
processus est une chose nodejs, OP cherche un moyen de le transmettre à SASS et non à Javascript
Vous pouvez ajouter des données à SASS en utilisant sass-loader
Par exemple pour passer le CDN_URL
de .env
Etendez webpack.mix.js
module.exports = { module: { rules: [ { test: /\.s[ac]ss$/i, use: [ 'style-loader', 'css-loader', { loader: 'sass-loader', options: { prependData: '$env: ' + process.env.CDN_URL + ';', }, }, ], }, ], }, };
J'utilise ceci mais j'obtiens l'erreur ci-dessous: CSS invalide après "... load the styles": attendu 1 sélecteur ou at-rule, était "var content = requi" J'ai utilisé Laravel 5.7, Laravel Mix 4.1.2 et webpack webpack 4.27.1.
Nous ne pouvons pas dire si vous n'incluez pas votre fichier SASS
_functions.scss: `` @function asset ($ type, $ file) {@return url ('# {$ cdn-s3-static-url} # {$ asset-base-path} # {$ type} / # {$ fil e} '); } `` `
Dans mon cas, je dirigeais un site Gatsby. Avant chaque build, il exécute gatsby-config.js, qui a accès aux variables d'environnement.
Donc, en haut du fichier .js qui construit, avant module.exports, je mets ceci:
@import './build-style.scss'; @font-face { font-family: "MyFontFamily"; src: url($root + "font/MyFontFamily.woff") format('woff'); }
Cela donne un fichier qui ressemble à:
$root: "/development-path/";
Ensuite, dans les fichiers SCSS où j'avais besoin d'un comportement dépendant d'ENV, j'ai: p>
if(process.env.NODE_ENV === 'development') { fs.writeFileSync('./src/styles/build-style.scss','$root: "/development-path/";'); } else { fs.writeFileSync('./src/styles/build-style.scss','$root: "/production-path/";'); }
Et maintenant, mon élément (la police dans cet exemple) se charge à partir de différents endroits en fonction de ma variable d'environnement de développement / production.
Cela ressemble à un gros hack et Je suis sûr qu'il y a un moyen plus correct quelque part, mais cela m'a fait bouger à nouveau après une heure d'arrêt et cela fonctionne jusqu'à présent. Je vais probablement l'étendre à l'avenir pour avoir build-style-dev.scss
, build-style-prod.scss
, et les copier simplement dans build- style.scss
au moment de la compilation. Ou faites des recherches dans le bon sens.