Saya mencoba mengonversi aplikasi sudut dari tegukan ke webpack. dalam gulp saya menggunakan gulp-preprocess untuk mengganti beberapa variabel pada halaman html (mis. nama basis data) tergantung pada NODE_ENV. Apa cara terbaik untuk mencapai hasil yang serupa dengan webpack?
javascript
webpack
kpg
sumber
sumber
Jawaban:
Ada dua cara dasar untuk mencapai ini.
Definisikan Plugin
Perhatikan bahwa ini hanya akan mengganti kecocokan "apa adanya". Itu sebabnya string dalam format apa adanya. Anda bisa memiliki struktur yang lebih kompleks, seperti objek di sana tetapi Anda mendapatkan idenya.
Plugin Lingkungan
EnvironmentPlugin
menggunakan secaraDefinePlugin
internal dan memetakan nilai-nilai lingkungan untuk kode melalui itu. Sintaks terser.Alias
Atau Anda dapat menggunakan konfigurasi melalui modul alias . Dari sisi konsumen akan terlihat seperti ini:
Konfigurasi itu sendiri dapat terlihat seperti ini:
Mari mengatakan
process.env.NODE_ENV
adalahdevelopment
. Itu akan memetakan ke./config/development.js
kemudian. Modul yang dipetakan ke dapat mengekspor konfigurasi seperti ini:sumber
JSON.stringify()
'process.env.NODE_ENV': `"${process.env.NODE_ENV || 'development'}"`
JSON.stringify('development')
karena mungkin tidak terlalu berguna. SebaliknyaJSON.stringify(someVariable)
bisa sangat!NODE_ENV
untuk melakukan itu. Cara mengatur itu tergantung pada platform Anda.process.env.NODE_ENV
pola dan berhasil.Hanya pilihan lain, jika Anda hanya ingin menggunakan antarmuka cli, cukup gunakan
define
opsi webpack. Saya menambahkan skrip berikut dipackage.json
:Jadi saya hanya perlu menjalankan
npm run build-production
.sumber
Saya menyelidiki beberapa opsi tentang cara mengatur variabel khusus lingkungan dan berakhir dengan ini:
Saya memiliki 2 konfigurasi webpack saat ini:
webpack.production.config.js
webpack.config.js
Dalam kode saya, saya mendapatkan nilai API_URL dengan cara (singkat) ini:
const apiUrl = process.env.API_URL;
EDIT 3 Nov 2016
Dokumen Webpack memiliki contoh: https://webpack.js.org/plugins/define-plugin/#usage
Dengan ESLint Anda harus secara khusus mengizinkan variabel yang tidak ditentukan dalam kode, jika Anda memiliki
no-undef
aturan. http://eslint.org/docs/rules/no-undef menyukai ini:EDIT 7 September, 2017 (Khusus-Buat-Reaksi-Aplikasi)
Jika Anda tidak terlalu banyak mengonfigurasi, periksa Create-React-App: Create-React-App - Menambahkan Variabel Lingkungan Kustom . Di bawah kap CRA tetap menggunakan Webpack.
sumber
process.env
maka tidakprocess.env.PORT
misalnya memutuskan untukundefined
selama membangun webpack yang berarti Anda tidak dapat lagi mengesampingkan port dari lingkungan?Anda dapat melewati argumen baris perintah apa pun tanpa menggunakan plugin tambahan
--env
karena webpack 2:Menggunakan variabel di webpack.config.js:
Sumber
sumber
Anda dapat langsung menggunakan yang
EnvironmentPlugin
tersediawebpack
untuk memiliki akses ke variabel lingkungan apa pun selama transpilasi.Anda hanya perlu mendeklarasikan plugin di
webpack.config.js
file Anda :Perhatikan bahwa Anda harus mendeklarasikan secara eksplisit nama variabel lingkungan yang ingin Anda gunakan.
sumber
Untuk menambah kumpulan jawaban secara pribadi, saya lebih suka yang berikut:
Menggunakan ini tidak ada variabel env yang funky atau masalah lintas platform (dengan env vars). Yang Anda lakukan adalah menjalankan yang normal
webpack
atauwebpack -p
untuk dev atau produksi masing-masing.Referensi: Masalah Github
sumber
'process.env.NODE_ENV': JSON.stringify('production')
lebihprocess: { env: { NODE_ENV: JSON.stringify('production') } }
. Menggunakan yang terakhir akan menimpa objek proses yang dapat merusak kompatibilitas dengan beberapa modul yang mengharapkan nilai lain pada objek proses yang akan ditentukan.Karena Edit saya pada posting di atas oleh thevangelist tidak disetujui , memposting informasi tambahan.
Jika Anda ingin memilih nilai dari package.json seperti nomor versi yang ditentukan dan mengaksesnya melalui DefinePlugin di dalam Javascript.
Kemudian, Impor package.json di dalam webpack.config masing-masing , akses atribut menggunakan variabel impor, kemudian gunakan atribut di DefinePlugin .
Misalnya konfigurasi tertentu di webpack.config menggunakan METADATA untuk DefinePlugin:
Akses ini di dalam file naskah apa pun:
Cara paling cerdas akan seperti ini:
Terima kasih untuk Ross Allen
sumber
Hanya jawaban lain yang mirip dengan jawaban @ zer0chain. Namun, dengan satu perbedaan.
Pengaturan
webpack -p
sudah cukup.Itu sama dengan:
Dan ini sama dengan
Jadi Anda hanya perlu sesuatu seperti ini di
package.json
file Node:Hanya beberapa tips dari DefinePlugin :
Ini agar Anda dapat memeriksa apakah Anda mengetik
webpack --help
sumber
Untuk menambah kumpulan jawaban:
Gunakan ExtendedDefinePlugin sebagai ganti DefinePlugin
ExtendedDefinePlugin jauh lebih mudah digunakan dan didokumentasikan tautan :-)
Karena DefinePlugin tidak memiliki dokumentasi yang baik, saya ingin membantu, dengan mengatakan bahwa itu benar-benar berfungsi seperti #DEFINE di c # .
Jadi, jika Anda ingin memahami cara kerja DefinePlugin, baca c # #define doucmentation. tautan
sumber
Saya lebih suka menggunakan file .env untuk lingkungan yang berbeda.
env.dev
ke .env ke folder rootenv.prod
ke .envdan dalam kode
menggunakan
require('dotenv').config(); const API = process.env.API ## which will store the value from .env file
sumber
Saya menemukan solusi berikut ini paling mudah untuk men-setup variabel lingkungan untuk Webpack 2:
Misalnya kami memiliki pengaturan paket web:
Tambahkan Variabel Lingkungan di Webpack:
Tentukan Variabel Plugin dan tambahkan ke
plugins
:Sekarang ketika menjalankan perintah webpack, sampaikan
env.NODE_ENV
sebagai argumen:Sekarang Anda dapat mengakses
NODE_ENV
variabel di mana saja dalam kode Anda.sumber
Sejak Webpack v4, hanya pengaturan
mode
di konfigurasi Webpack Anda akan mengaturNODE_ENV
untuk Anda (viaDefinePlugin
). Dokumen di sini.sumber
Berikut adalah cara yang telah bekerja untuk saya dan memungkinkan saya menjaga variabel lingkungan saya KERING dengan menggunakan kembali file json.
sumber
Saya bukan penggemar ...
... karena tidak menyediakan jenis keamanan apa pun. alih-alih, Anda akhirnya meningkatkan hal-hal rahasia Anda, kecuali jika Anda menambahkan paket web ke gitignore 🤷♀️ ada solusi yang lebih baik.
Pada dasarnya dengan konfigurasi ini setelah Anda mengkompilasi kode Anda semua variabel proses env akan dihapus dari seluruh kode, tidak akan ada proses.env.VAR tunggal berkat plugin babel
transform-inline-environment-variables
PS jika Anda tidak ingin berakhir dengan sejumlah besar undefines, pastikan Anda memanggil env.js sebelum panggilan webpack babel-loader, itu sebabnya itu adalah panggilan webpack hal pertama. array vars dalam file babel.config.js harus cocok dengan objek di env.js. sekarang hanya ada satu hal yang harus dilakukan. tambahkan.env
file, letakkan semua variabel env Anda di sana, file tersebut harus di root proyek atau jangan ragu untuk menambahkannya di mana pun Anda inginkan, pastikan untuk mengatur lokasi yang sama pada file env.js dan juga menambahkannya ke gitignoreJika Anda ingin melihat seluruh babel + webpack + ts dapatkan dari heaw
https://github.com/EnetoJara/Node-typescript-babel-webpack.git
dan logika yang sama berlaku untuk bereaksi dan yang lainnya 💩
env.js
file webpack tanpa troll plugin
babel.config.js
sumber
Saya tidak tahu mengapa, tetapi tidak ada yang benar-benar menyebutkan solusi paling sederhana. Ini bekerja untuk saya untuk nodejs dan mendengus. Sedangkan bagi banyak orang webpack bisa membingungkan Anda cukup menggunakan baris di bawah ini:
process.env.NODE_ENV = 'production';
Dengan solusi di atas Anda tidak benar-benar perlu menggunakan iri atau webpack. Kadang-kadang solusi hardcode sederhana dapat bekerja untuk beberapa orang.
sumber