node.js - Hvordan forby å erstatte process.env-variabler under kompilering i webpack?
Historie
Jeg utvikler AWS Lambda-funksjonene og kompilerer koden ved å bruke webpack.
Jeg har lest noen av artiklene, og det ser ut til at process.env-variablene automatisk blir erstattet under kompilering. Selv om det er kult, vil jeg forby denne oppførselen.
Hvorfor?
Fordi jeg sender miljøvariabler via AWS Lambda-dashbordet.
Webpack-konfigurasjon
const nodeExternals = require('webpack-node-externals')
const webpack = require('webpack')
const path = require('path')
module.exports = {
target: 'node',
entry: path.resolve(__dirname, 'index.ts'),
externals: [nodeExternals()],
devtool: 'inline-source-map',
mode: 'production',
module: {
rules: [{
test: /\.tsx?$/,
use: [{
loader: 'ts-loader',
options: {
experimentalWatchApi: true,
},
}],
}]
},
plugins: [],
resolve: {
extensions: ['.tsx', '.ts', '.js']
},
output: {
filename: 'index.js',
libraryTarget: 'commonjs',
path: path.resolve(__dirname, 'dist')
}
}
Spørsmål
Er det mulig å forhindre oppførselen med å erstatte process.env-variablene under webpack-kompilering? Hvis ja, vennligst hjelp meg med å oppnå denne effekten.
Svar #1
Sett optimization.nodeEnv til false
Fra :
https://webpack.js.org/configuration/optimization/#optimizationnodeenv
optimalisering.nodeEnv
boolean=false streng
Forteller webpack å sette process.env.NODE_ENV til en gitt strengverdi. optimization.nodeEnv > bruker DefinePlugin med mindre det er satt til false. optimization.nodeEnv standardiseres til mode hvis satt, > ellers går det tilbake til 'production'.
Svar #2
Selv om det å sette optimization.nodeEnv til false fungerer for NODE_ENV-variabelen, fungerer det ikke for alle miljøvariabler, og det forhindrer ikke at process.env blir erstattet i den kompilerte koden.
Jeg jobber med Webpack på backend, så det er viktig å ha tilgang under runtime.
Siden det ikke ser ut til å finnes en offisiell måte å bevare process.env i den kompilerte koden på, fant jeg denne løsningen, som fungerte for meg.
Jeg måtte definere en ny global variabel, som jeg kalte ENVIRONMENT, som vil bli erstattet med process.env under kompilering.
new webpack.DefinePlugin({
ENVIRONMENT: 'process.env',
}),
I koden min ville jeg da få tilgang til det som et vanlig objekt:
ENVIRONMENT.DATABASE_URL
Ovenstående kompileres til process.env.DATABASE_URL.
