deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak dev.to (home feed)

myjs, Python için pip ile kurulabilen bir JavaScript yorumlayıcısı — Node veya tarayıcı gerekmiyor

dev.to'da tanıtılan myjs, Python için pip ile kurulabilen bir JavaScript yorumlayıcısı: betikleri çalıştırıyor, HTML'i headless olarak render ediyor, DOM'u script'liyor ve Node ya da tarayıcı olmadan Python paketlerine ile C kütüphanelerine erişiyor.

myjs, Python için pip ile kurulabilen bir JavaScript yorumlayıcısı — Node veya tarayıcı gerekmiyor

dev.to'daki bir yazı, Python'da yazılmış ve pip paketi olarak dağıtılan bir JavaScript yorumlayıcısı olan myjs'yi tanıtıyor. Yazıya göre myjs, .js dosyalarını çalıştırıyor, HTML sayfalarını headless biçimde render ediyor, DOM'u script'liyor, bir ffi katmanı üzerinden yerel C kütüphanelerini çağırıyor ve JavaScript'ten daha geniş Python ekosistemine erişim sağlıyor — Node runtime, tarayıcı ve derleme adımı olmadan.

Pip ile kurulabilen bir runtime

Araç pip ile, ya da izole bir CLI için pipx ile kuruluyor. myjs komutu, kalıcı readline geçmişi, geriye doğru arama, TAB tamamlama, otomatik algılanan çok satırlı girdi ve top-level await içeren bir REPL açıyor. Aynı binary, betik dosyalarını çalıştırıyor (ek argümanlar globalThis.argv olarak geliyor), -e ile parçacıkları değerlendiriyor ve .html dosyalarını headless biçimde render ederek ortaya çıkan HTML'i stdout'a ya da bir dosyaya yazıyor. --strip-scripts bayrağı, script elementlerini çalıştırıldıktan sonra kaldırıyor ve isteğe bağlı myjs[gui] eklentisi, render edilmiş DOM'u yerel bir pencerede gösterebiliyor. Paketle birlikte örnek uygulamalar da geliyor; öldürülebilir worker'lara ve ham tuş vuruşu işlemeye sahip cockpit adlı canlı bir terminal panosu bunlardan biri.

Python tarafındaki API

Python tarafından myjs.eval ifadeleri değerlendiriyor, myjs.run dosyaları çalıştırıyor ve myjs.Session izole bir global scope oluşturuyor — yazı, bir session'ın bir değişkeni değerlendirmesini ve sonraki bir eval çağrısında onu geri okumasını gösteriyor. Session'lar başlangıç scope sözlüğü kabul ediyor, console.log çıktısını bir console_lines niteliğinde yakalıyor ve kaçan JavaScript exception'larını, orijinal adı, satır numarasını ve çağrı yığınını taşıyan myjs.JSError nesnelerine çeviriyor. myjs.import_js daha da ileri gidiyor: bir .js dosyasını, dışa aktarılan fonksiyonlarının doğrudan çağrılabilir hale geldiği bir Python modülü olarak yüklüyor — örnek, ikiyle çarpma fonksiyonunu import edip düz Python'dan çağırıyor.

Web platformu kapsamı

Script'ler document, window ve yaklaşık 190 constructor'ı görüyor; bunlar arasında URL, Headers, Event, DOMRect ve TextEncoder var ve createElement ile appendChild kullanarak gerçek DOM ağaçları kurmaya yetiyor. Event loop; Promise combinator'larını, async/await, setTimeout, setInterval ve queueMicrotask'ı destekliyor; microtask'lar timer'lardan önce boşaltılıyor. fetch asenkron ve thread tabanlı, yani birkaç fetch üzerinde Promise.all beklemek gerçekten eşzamanlı çalışıyor ve WebSocket gerçek bir RFC 6455 istemcisi olarak tanımlanıyor.

Node tarzı fs, path, sh, http, os ve process modülleri; ham byte okumaları dahil dosya G/Ç'sini, shell komutlarını, ortam erişimini ve küçük bir HTTP sunucusunu kapsarken, önceden import edilmiş struct modülü ek kütüphane olmadan BMP, PNG ve ELF gibi ikili başlıkları ayrıştırıyor. console; %s, %d ve %c biçimlendirmesinin yanı sıra table, group, count, time ve assert'ı uyguluyor. macOS'ta script'lerin reportedly prompt, confirm ve dosya seçiciler gibi yerel diyalogları yönetebildiği, sistem panosunu okuyup yazabildiği ve say, notify, hash, atob/btoa ile localStorage'ı kullanabildiği belirtiliyor.

Python ve C'ye köprüler

Bir py nesnesi JavaScript'ten Python değerlendiriyor ve pandas ya da sqlite3 gibi paketleri import ediyor; ES module'larda bir çıplak specifier bir Python modülüne çözümleniyor — yazıdaki örnek numpy import etmek. ffi modülü C kütüphanelerini node-gyp ve derleyici olmadan ctypes üzerinden yüklüyor; demo libc'yi yükleyip abs için argüman ve dönüş tiplerini bildiriyor ve onu çağırıyor.

Headless render için myjs.Page.load yerel bir yolu ya da http(s) URL'sini kabul ediyor, sayfayı CSS ve script'leriyle birlikte fetch ediyor, CSS'i belgeye katlıyor böylece getComputedStyle kuralları görüyor, module script'lerine module semantiği veriyor ve DOMContentLoaded ile load'ı tetikliyor. Sayfalar otomasyon için eval, fill, submit, wait_for ve text sunuyor ve myjs.render tek çağrıda sunucu tarafı render yapıyor. Yazı bunu, 150 MB'lık bir Chromium indirmesi yerine bir pip install ile sunulan Puppeteer tarzı otomasyon olarak çerçeveliyor.

Nasıl inşa edildi

myjs, acorn parser'ının domonic-libs portunun üzerinde bir runtime katmanı: domonic'in DOM'u üzerinde çalışan ve JavaScript'i kaynaktan AST'ye ve geri taşıyabilen bir ağaç gezinmeli değerlendirici artı bir kod üreteci; domonic-libs ile birlikte aynı adımlarla yayınlanıyor. Dil katmanının closure'lar, sınıflar, destructuring, generator'lar, async/await, prototype zincirleri, Symbol ve çekirdek built-in'leri kapsayan seçilmiş test262 tarzı bir test dizisini geçtiği belirtiliyor; Proxy ve with açıkça kapsam dışı. Proje MIT lisanslı ve dokümantasyonunda eksiksiz bir referans bulunuyor.

Neden önemli

Bugün Python'dan JavaScript çalıştırmak genellikle yanına Node kurmak demek ve render edilmiş bir DOM'a dokunmak tipik olarak headless Chromium indirmek demek. myjs üçüncü bir yol öneriyor: dili yorumlayan, scraping ve sunucu tarafı render için web platformunun yeterince fazlasını taklit eden ve Python'un paket dizini ile yerel C kütüphaneleriyle iki yönlü trafiği açan tek bir bağımlılık. Bu ayak izi; script yazmak, test etmek, JavaScript'i veri boru hatlarına yapıştırmak ya da tam bir araç zincirinin pratik olmadığı kısıtlı ortamlar için çekici. Ancak uyarılar da ağır basıyor: yukarıdaki her yetenek bağımsız incelemecilerce değil, projenin kendi dev.to yazısında tanımlıyor, dil katmanı Proxy ve with'i atlıyor ve ağaç gezinmeli bir yorumlayıcı ham hızda V8 ile boy ölçüşemez. Yine de iki çok büyük ekosistem arasındaki hafif bir köprü olarak, Python araç rafına ayrıksı bir katkı.

  • #javascript
  • #python
  • #interpreter
  • #developer-tools
  • #open-source

İlgili yazılar