Saya masih bingung bagaimana menyelesaikan jalur modul dengan webpack. Sekarang saya menulis:
myfile = require('../../mydir/myfile.js')
tapi saya ingin menulis
myfile = require('mydir/myfile.js')
Saya berpikir bahwa resol.alias dapat membantu karena saya melihat contoh serupa menggunakan { xyz: "/some/dir" }
alias maka saya bisa require("xyz/file.js")
.
Tetapi jika saya mengatur alias saya untuk { mydir: '/absolute/path/mydir' }
, require('mydir/myfile.js')
tidak akan berfungsi.
Saya merasa bodoh karena saya telah membaca dokumen berkali-kali dan saya merasa kehilangan sesuatu. Apa cara yang benar untuk menghindari penulisan semua persyaratan relatif dengan ../../
dll?
javascript
webpack
gpbl
sumber
sumber
resolve.alias
bekerja persis seperti yang Anda sarankan. Saya ingin tahu apakah itu gagal karena ada hal lain dalamresolve
konfigurasi Anda . Saya menggunakanalias{ mydir: path.resolve( __dirname, 'path', 'to', 'mydir' )
danrequire( 'mydir/myfile.js' )
berfungsi dengan baik.Jawaban:
Webpack> 2.0
Lihat jawaban wtk .
Webpack 1.0
Cara yang lebih mudah untuk melakukan ini adalah dengan menggunakan resol.root.
http://webpack.github.io/docs/configuration.html#resolve-root
Dalam kasus Anda:
konfigurasi webpack
modul mengkonsumsi
atau
lihat juga: http://webpack.github.io/docs/configuration.html#resolve-modulesdirectories
sumber
root
,,modulesDirectories
dan campuran keduanya, tetapi tidak berhasil. Tampaknya submodul (mis.require("mydir/file")
) Tidak diterima.WebpackOptionsValidationError: Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema. - configuration.resolve has an unknown property 'root'.
Untuk referensi di masa mendatang, webpack 2 menghapus semuanya tetapi
modules
sebagai cara untuk menyelesaikan jalur. Ini berarti tidakroot
akan berfungsi.https://gist.github.com/sokra/27b24881210b56bbaff7#resolving-options
Contoh konfigurasi dimulai dengan:
sumber
modulesDirectories
masih digunakan oleh webpack-dev-server, bahkan dengan webpack 2, yang membuat ini sangat membingungkan.resolve.alias
harus bekerja persis seperti yang Anda gambarkan, jadi saya memberikan ini sebagai jawaban untuk membantu mengurangi kebingungan yang mungkin timbul dari saran di pertanyaan awal yang tidak berfungsi.konfigurasi penyelesaian seperti yang di bawah ini akan memberi Anda hasil yang diinginkan:
require( 'mydir/myfile.js' )
akan bekerja seperti yang diharapkan. Jika tidak, pasti ada masalah lain.Jika Anda memiliki beberapa modul yang ingin Anda tambahkan ke jalur pencarian,
resolve.root
masuk akal, tetapi jika Anda hanya ingin dapat referensi komponen dalam kode aplikasi Anda tanpa jalur relatif,alias
tampaknya menjadi yang paling mudah dan eksplisit.Keuntungan penting dari itu
alias
adalah memberi Anda kesempatan untuk namespace Andarequire
yang dapat menambah kejelasan kode Anda; sama seperti mudah untuk melihat darirequire
modul lain apa yang sedang direferensikan,alias
memungkinkan Anda untuk menulis deskriptifrequire
yang membuatnya jelas Anda memerlukan modul internal, misalnyarequire( 'my-project/component' )
.resolve.root
cukup masukkan Anda ke direktori yang diinginkan tanpa memberi Anda kesempatan untuk namespace lebih jauh.sumber
alias: {'~': path.resolve(__dirname)},
require('mydir/myfile')
)? Itu seharusnya bekerja. Anda dapat memiliki beberapa entri dialias
; Saya menggunakannya untuk mengimpor darisrc
direktori saya untuk modul JavaScript dan yang lain untuk mengimpor daristyles
direktori saya untuk css. Beri tahu saya jika saya salah mengerti pertanyaan Anda.import './path/to/Component1';
- hanya tanpa nama file dalam & ekstensi di jalan. webpack entah bagaimana berhasil mendeteksi bahwa file dalam memiliki nama direktori, dan baru saja mengimpornya. sekarang yang ingin saya lakukan adalah mengimpornya seperti itu:import 'shared\Component1';
ketika 'dibagikan' adalah alias. tetapi tidak berfungsi tanpa menentukan nama file dalam. Terima kasih!Jika ada orang lain yang mengalami masalah ini, saya bisa membuatnya berfungsi seperti ini:
di mana struktur direktori saya adalah:
Lalu dari mana saja di
src
direktori saya dapat menelepon:sumber
'node_modules'
sebagai gantinya.[ path.resolve(__dirname, 'src'), 'node_modules' ],
lodash
, saya inginlodash
diselesaikan HANYA dariprojectA/node_modules
. Inilah yangresolve.modules: [path.resolve(__dirname, 'node_modules')]
berguna untuk. Namun saya mengalami masalah dengan sub-dependensi seperti yang Anda katakan. Apakah ada cara untuk memberitahu webpack untuk juga menemukan sub-dependensi selain membatasi resolusi node_modulesprojectA/node_modules
?Sakit kepala terbesar saya adalah bekerja tanpa jalur nama. Sesuatu seperti ini:
Sebelum saya biasa mengatur lingkungan saya untuk melakukan ini:
Saya menemukan jauh lebih nyaman menghindari
src
jalur implisit , yang menyembunyikan informasi konteks penting.Tujuan saya adalah meminta seperti ini:
Seperti yang Anda lihat, semua kode aplikasi saya hidup dalam namespace jalur wajib. Ini membuat cukup jelas yang membutuhkan panggilan membutuhkan perpustakaan, kode aplikasi atau file uji.
Untuk ini saya memastikan bahwa jalur tekad saya adil
node_modules
dan folder aplikasi saat ini, kecuali jika Anda namespace aplikasi Anda di dalam folder sumber Anda sepertisrc/my_app
Ini adalah default saya dengan webpack
Akan lebih baik jika Anda mengatur lingkungan var
NODE_PATH
ke file proyek Anda saat ini. Ini adalah solusi yang lebih universal dan ini akan membantu jika Anda ingin menggunakan alat lain tanpa paket web: pengujian, linting ...sumber
Saya telah mengatasinya dengan Webpack 2 seperti ini:
Anda dapat menambahkan lebih banyak direktori ke array ...
sumber
Selesaikan ini dengan menggunakan Webpack 2:
sumber
Jika Anda menggunakan create-react-app , Anda bisa menambahkan
.env
file yang berisiSumber: https://medium.com/@ktruong008/absolute-imports-with-create-react-app-4338fbca7e3d
sumber
Utas ini sudah lama tetapi karena tidak ada yang memposting tentang membutuhkan.konteks saya akan menyebutkannya:
Anda dapat menggunakan require.context untuk mengatur folder untuk dilihat seperti ini:
sumber
Saya tidak mengerti mengapa ada orang yang menyarankan untuk memasukkan direktori induk myDir ke dalam modulesDirectories di webpack, yang seharusnya mempermudahnya:
sumber
Cukup gunakan babel-plugin-module-resolver :
Kemudian buat
.babelrc
file di bawah root jika Anda belum memilikinya:Dan semua yang ada di bawah root akan diperlakukan sebagai impor mutlak:
Untuk dukungan VSCode / Eslint, lihat di sini .
sumber