Bagaimana cara memasukkan file JavaScript di lain file JavaScript?
Apakah ada sesuatu di JavaScript mirip dengan @import
di CSS yang memungkinkan anda untuk memasukkan sebuah file JavaScript di dalam yang lain file JavaScript?
4870
58
Versi lama dari JavaScript tidak impor, termasuk, atau memerlukan, begitu banyak pendekatan yang berbeda untuk masalah ini telah dikembangkan. Tapi sejak 2015 (ES6), JavaScript memiliki ES6 modul standar untuk mengimpor modul di Node.js ini, yang juga didukung oleh sebagian besar browser modern. Untuk kompatibilitas dengan browser lama, membangun dan/atau transpilation alat-alat yang dapat digunakan.
ES6 Modul
ECMAScript (ES6) modul telah didukung dalam Node.js sejak v8.5, dengan
--eksperimental-modul
bendera. Semua file yang terlibat harus memiliki.mjs
ekstensi.ECMAScript modul di browser
Browser memiliki dukungan untuk memuat ECMAScript modul langsung (tidak ada alat-alat seperti Webpack diperlukan) sejak Safari 10.1, Chrome 61, Firefox 60, dan Edge 16. Periksa arus dukungan di caniuse.
Baca lebih lanjut di https://jakearchibald.com/2017/es-modules-in-browsers/
Dinamis impor di browser
Dinamis impor biarkan script load script lain yang diperlukan:
Baca lebih lanjut di https://developers.google.com/web/updates/2017/11/dynamic-import
Node.js memerlukan
Gaya lama mengimpor modul, masih banyak digunakan di Node.js, adalah modul.ekspor/require sistem.
Ada cara lain untuk JavaScript untuk menyertakan JavaScript eksternal isi di browser yang tidak memerlukan preprocessing.
AJAX Loading
Anda bisa memuat tambahan script dengan AJAX call dan kemudian menggunakan
eval
untuk menjalankannya. Ini adalah cara yang paling mudah, tetapi terbatas untuk domain anda karena JavaScript sandbox model keamanan. Menggunakaneval
juga membuka pintu untuk bug, hacks dan masalah keamanan.Fetch Loading
Seperti Dinamis Impor anda dapat memuat satu atau banyak script dengan
mengambil
call menggunakan janji-janji untuk mengontrol urutan eksekusi script dependensi menggunakan Mengambil Inject perpustakaan:jQuery Loading
The jQuery perpustakaan menyediakan fungsi pemuatan dalam satu baris:
Dinamis Pemuatan Naskah
Anda bisa menambahkan tag script dengan script URL ke dalam HTML. Untuk menghindari overhead jQuery, ini adalah solusi yang ideal. Script bahkan dapat berada pada server yang berbeda. Selain itu, browser mengevaluasi kode. The
<script>
tag dapat disuntikkan ke salah satu halaman web<head>
, atau dimasukkan sebelum penutupan</body>
tag. Berikut adalah contoh bagaimana ini bisa bekerja:Fungsi ini akan menambahkan baru
<script>
tag ke ujung kepala bagian atas halaman, di manasrc
atribut diatur untuk URL yang diberikan untuk fungsi sebagai parameter. Kedua solusi ini dibahas dan diilustrasikan di JavaScript Kegilaan: Dinamis Pemuatan Naskah.Mendeteksi ketika naskah telah dieksekusi
Sekarang, ada masalah besar yang anda harus tahu tentang. Melakukan hal itu berarti bahwa anda dari jarak jauh memuat kode. Web browser Modern akan memuat file dan tetap mengeksekusi anda saat ini script karena mereka memuat segala sesuatu asynchronously untuk meningkatkan kinerja. (Hal ini berlaku untuk kedua metode jQuery dan manual dinamis pemuatan naskah metode.) Itu berarti bahwa jika anda menggunakan trik ini secara langsung, anda tidak't dapat menggunakan yang baru dimuat kode baris berikutnya setelah anda meminta untuk dimuat, karena akan masih loading. Misalnya:
my_lovely_script.js
berisiMySuperObject
:Kemudian anda reload halaman memukul F5. Dan itu bekerja! Membingungkan... Jadi apa yang harus dilakukan tentang hal itu ? Nah, anda dapat menggunakan hack penulis menunjukkan di link yang aku berikan padamu. Singkatnya, bagi orang-orang terburu-buru, ia menggunakan sebuah acara untuk menjalankan fungsi callback ketika naskah ini dimuat. Sehingga anda dapat menempatkan semua kode menggunakan remote perpustakaan dalam fungsi callback. Misalnya:
Kemudian anda menulis kode yang ingin anda gunakan SETELAH naskah ini dimuat di lambda function:
Kemudian anda menjalankan semua bahwa:
Perhatikan bahwa script dapat dieksekusi setelah DOM telah dimuat, atau sebelum, tergantung pada browser dan apakah anda termasuk garis
script.async = false;
. Ada's artikel yang bagus pada Javascript loading secara umum yang membahas ini.Source Code Merge/Preprocessing
Seperti yang disebutkan di atas jawaban ini, banyak pengembang menggunakan build/transpilation tool(s) seperti Parcel, Webpack, atau Babel dalam proyek-proyek mereka, yang memungkinkan mereka untuk menggunakan mendatang JavaScript sintaks, memberikan kompatibilitas untuk browser lama, menggabungkan file, mengecilkan, melakukan kode membelah dll.
Jika ada orang yang mencari sesuatu yang lebih maju, mencoba RequireJS. Anda'akan mendapatkan manfaat tambahan seperti ketergantungan manajemen, baik concurrency, dan menghindari duplikasi (yaitu, mengambil naskah lebih dari sekali).
Anda dapat menulis file JavaScript di "modul" dan kemudian referensi mereka sebagai dependensi dalam script lain. Atau anda dapat menggunakan RequireJS sebagai sederhana "pergi mendapatkan script ini" solusi.
Contoh:
Menentukan dependensi sebagai modul:
some-dependency.js
implementation.js anda "main" JavaScript file yang tergantung pada some-dependency.js
Kutipan dari GitHub README:
Ada benar-benar sebuah _is cara untuk me-load file JavaScript not asynchronous, sehingga anda bisa menggunakan fungsi-fungsi yang disertakan dalam file baru file yang dimuat tepat setelah pemuatan itu, dan saya pikir itu bekerja di semua browser.
Anda perlu menggunakan
jQuery.append()
pada<head>
elemen halaman anda, yaitu:Namun, metode ini juga memiliki masalah: jika terjadi kesalahan dalam impor file JavaScript, Firebug (dan juga Firefox Error Console dan Chrome Developer Tools juga) akan melaporkan tempatnya salah, yang merupakan masalah besar jika anda menggunakan Firebug untuk melacak kesalahan JavaScript turun banyak (saya lakukan). Firebug hanya doesn't tahu tentang yang baru dimuat file untuk beberapa alasan, sehingga jika terjadi kesalahan dalam file tersebut, maka laporan bahwa hal itu terjadi di utama anda HTML file, dan anda akan memiliki kesulitan menemukan alasan yang nyata bagi kesalahan.
Tapi jika itu tidak masalah bagi anda, maka metode ini harus bekerja.
Saya telah benar-benar menulis sebuah plugin jQuery yang disebut $.import_js() yang menggunakan metode ini:
Jadi semua yang anda akan perlu untuk melakukan impor JavaScript adalah:
Saya juga membuat sebuah tes sederhana untuk ini di Contoh.
Ini termasuk
main.js
file dalam HTML utama dan kemudian script dimain.js
menggunakan$.import_js()
untuk mengimpor file tambahan yang disebutincluded.js
, yang mendefinisikan fungsi ini:Dan tepat setelah termasuk
included.js
,hello()
fungsi dipanggil, dan anda mendapatkan peringatan.(Jawaban ini adalah dalam menanggapi e-satis' komentar).
Cara lain, yang menurut saya jauh lebih bersih, adalah untuk membuat sinkron permintaan Ajax bukan menggunakan
<script>
tag. Yang ini juga cara [Node.js][1] menangani termasuk.Berikut ini's contoh menggunakan jQuery:
Ada kabar baik untuk anda. Sangat segera anda akan dapat memuat kode JavaScript dengan mudah. Itu akan menjadi cara standar untuk mengimpor modul kode JavaScript dan akan menjadi bagian dari inti JavaScript itu sendiri.
Anda hanya harus menulis
impor cond dari 'cond.js';
untuk memuat makro yang bernamacond
dari filecond.js
.Sehingga anda don't harus mengandalkan JavaScript framework anda juga tidak harus secara eksplisit membuat Ajax panggilan.
Merujuk ke:
Modul statis resolusi
Module loader
Hal ini dimungkinkan untuk secara dinamis menghasilkan tag JavaScript dan menambahkannya ke dokumen HTML dari dalam lainnya kode JavaScript. Ini akan memuat ditargetkan file JavaScript.
Pernyataan
impor
dalam ECMAScript 6.Sintaks
Mungkin anda dapat menggunakan fungsi ini yang saya temukan pada halaman ini Bagaimana saya sertakan file JavaScript di file JavaScript?:
Berikut adalah sinkron versi tanpa jQuery:
Saya hanya menulis ini kode JavaScript (menggunakan Prototype DOM manipulasi):
Penggunaan:
Inti: http://gist.github.com/284442.
Berikut ini's versi umum dari bagaimana Facebook itu untuk mereka di mana-mana Seperti tombol:
Jika ia bekerja untuk Facebook, itu akan bekerja untuk anda.
Alasan mengapa kita melihat untuk pertama
script
elemen bukankepala
atautubuh
ini karena beberapa browser don't membuat satu jika hilang, tapi kami're dijamin untuk memilikiscript
element - satu ini. Baca lebih lanjut di http://www.jspatterns.com/the-ridiculous-case-of-adding-a-script-element/.Jika anda ingin murni JavaScript, anda dapat menggunakan
dokumen.menulis
.Jika anda menggunakan library jQuery, anda dapat menggunakan
$.getScript
metode.Anda juga bisa merakit script anda menggunakan PHP:
File
main.js.php
:Sebagian besar solusi yang ditampilkan di sini berarti dinamis pemuatan. Aku mencari bukan untuk compiler yang merakit semua tergantung file menjadi satu file output. Sama seperti Kurang/Sass preprosesor berurusan dengan CSS
@import
di-aturan. Karena saya didn't menemukan sesuatu yang layak semacam ini, saya menulis sebuah alat sederhana untuk memecahkan masalah.Jadi di sini adalah compiler, https://github.com/dsheiko/jsic, yang menggantikan
$impor("file-path")
dengan berkas yang diminta konten aman. Berikut adalah sesuai Kasar plugin: https://github.com/dsheiko/grunt-jsic.Pada jQuery menguasai cabang, mereka hanya menggabungkan atom file sumber ke dalam satu dimulai dengan
intro.js
dan berakhir denganouttro.js
. Itu doesn't cocok untuk saya karena tidak memberikan fleksibilitas pada kode sumber desain. Memeriksa cara kerjanya dengan jsic:src/main.js
src/Form/Input/Tel.js
Sekarang kita dapat menjalankan compiler:
Dan dapatkan gabungan file
build/main.js
Jika niat anda untuk load file JavaScript adalah menggunakan fungsi impor/termasuk file, anda juga dapat menentukan objek global dan mengatur fungsi-fungsi sebagai objek item. Misalnya:
global.js
file1.js
file2.js
main.js
Anda hanya perlu berhati-hati bila anda termasuk script di file HTML. Order harus seperti di bawah ini:
Ini harus dilakukan:
Atau bukan termasuk saat menjalankan, menggunakan script untuk menggabungkan sebelum meng-upload.
Saya menggunakan Sprocket (I don't tahu jika ada orang lain). Anda membangun kode JavaScript dalam file terpisah dan termasuk komentar yang diproses oleh Sprocket mesin mencakup. Untuk pengembangan anda dapat menyertakan file-file secara berurutan, maka untuk produksi untuk menggabungkan mereka...
Lihat juga:
Dalam kasus anda menggunakan Pekerja Web dan ingin memasukkan script tambahan dalam lingkup pekerja, jawaban lain yang disediakan tentang menambahkan script untuk
kepala
tag, dll. tidak akan bekerja untuk anda.Untungnya, Web Pekerja mereka sendiri
importScripts
fungsi yang merupakan fungsi global dalam lingkup Web Pekerja, asli ke browser itu sendiri seperti itu adalah bagian dari spesifikasi.Atau, sebagai tertinggi kedua sebagai jawaban untuk pertanyaan anda highlight, RequireJS juga dapat menangani termasuk script dalam Web Pekerja (kemungkinan memanggil
importScripts
itu sendiri, tetapi dengan beberapa fitur berguna lainnya).Saya punya masalah sederhana, tapi saya masih bingung dengan tanggapan terhadap pertanyaan ini.
Aku harus menggunakan variabel (myVar1) didefinisikan dalam satu file JavaScript (myvariables.js) di lain file JavaScript (main.js).
Untuk hal ini saya lakukan sebagai berikut:
Dimuat kode JavaScript dalam HTML file, dalam urutan yang benar, myvariables.js pertama, kemudian main.js:
File: myvariables.js
File: main.js
Seperti yang anda lihat, saya telah menggunakan variabel dalam satu file JavaScript di lain file JavaScript, tapi aku didn't perlu untuk memiliki satu sama lain. Aku hanya perlu memastikan bahwa file JavaScript dimuat sebelum kedua file JavaScript, dan, yang pertama file JavaScript's variabel dapat diakses di kedua file JavaScript, secara otomatis.
Ini menyelamatkan saya di malam hari. Saya harap ini membantu.
The
@import
sintaks untuk mencapai CSS-seperti JavaScript mengimpor mungkin menggunakan alat seperti [Campuran]() melalui special.mix
jenis file (lihat di sini). Saya membayangkan aplikasi hanya menggunakan salah satu dari metode tersebut interally, meskipun aku don't tahu.Dari Campuran dokumentasi
.mix
file:Berikut ini's contoh
.mix
file yang menggabungkan beberapa.js
file menjadi satu:Campuran output ini sebagai
scripts-global.js
dan juga sebagai versi minified (scripts-global.min.js
).Catatan: saya'm tidak dalam cara apapun berafiliasi dengan Campuran, selain menggunakan itu sebagai front-end development tool. Saya datang di pertanyaan ini setelah melihat
.mix
file JavaScript dalam tindakan (dalam satu Campuran boilerplates) dan menjadi sedikit bingung dengan hal itu ("anda dapat melakukan hal ini?" saya pikir ke diri sendiri). Kemudian saya menyadari bahwa itu adalah sebuah aplikasi-jenis file tertentu (agak mengecewakan, setuju). Namun demikian, menemukan pengetahuan yang mungkin bermanfaat bagi orang lain.UPDATE: Campuran gratis (offline).
UPDATE: Campuran sekarang dihentikan. Old campuran rilis masih tersedia