Πού οδηγεί το «Export notes»;
Αυτός ο οδηγός χρησιμοποιεί μια μικρή εφαρμογή Electron. Πατώντας Export notes, καλείται ένα API στη σελίδα, η ενέργεια περνά στην κύρια διεργασία και γράφεται ένα CSV. Η συμπεριφορά κατανέμεται σε αρκετά αρχεία.
Η εξαγωγή CSV μεταξύ των διεργασιών του Electron
-
Renderer → preload
notes.exportCsv()Τοrenderer.jsκαλεί το API που εκθέτει τοpreload.js. -
Μεταξύ διεργασιών
notes:exportΤο preload καλεί ένα κανάλι IPC: ένα ονομασμένο μήνυμα προς την κύρια διεργασία. -
Κύρια διεργασίαΈνας χειριστής εξαγωγήςΤο
main.jsχειρίζεται αυτό το κανάλι και καλεί τον κώδικα εγγραφής CSV.
Το csv.js μορφοποιεί τις σημειώσεις → το main.js γράφει το downloads/notes.csv.
Ρωτήστε για την εξαγωγή CSV
Συνδέστε τον βοηθό σας με το REA και δώστε του τον κατάλογο της εφαρμογής ή το αρχείο ASAR:
Χρησιμοποιήστε το REA για να βρείτε τι συμβαίνει όταν εξάγω σημειώσεις σε αυτή την εφαρμογή. Πού δημιουργείται το CSV;
Παράδειγμα προτροπής. Συμπεριλάβετε την απόλυτη διαδρομή προς τον φάκελο της εφαρμογής ή το app.asar.
Το REA διαβάζει τα αρχεία της εφαρμογής και δημιουργεί έναν χάρτη σημείων εισόδου, μονάδων και ορίων διεργασιών. Ο βοηθός σας χρησιμοποιεί αυτόν τον χάρτη για να εστιάσει τη διερεύνηση στη λειτουργία εξαγωγής.
Ακολουθήστε τον κώδικα εξαγωγής
Η σελίδα καλεί ένα μικρό API
document.querySelector("#export").addEventListener("click", async () => {
const destination = await window.notes.exportCsv();
document.querySelector("#status").textContent = `Saved to ${destination}`;
});
Η σελίδα γνωρίζει το όνομα της μεθόδου. Η υλοποίηση βρίσκεται στο preload, που την εκθέτει στον renderer.
contextBridge.exposeInMainWorld("notes", {
exportCsv: () => ipcRenderer.invoke("notes:export"),
});
Το REA καταγράφει το notes.exportCsv και το κυριολεκτικό όνομα καναλιού notes:export. Αντιστοιχίζει αυτή την κλήση με τον μοναδικό αντίστοιχο χειριστή στην κύρια διεργασία.
ipcMain.handle("notes:export", () => {
const destination = path.join(app.getPath("downloads"), "notes.csv");
writeFileSync(destination, toCsv(notes), "utf8");
return destination;
});
Η ανάγνωση του χειριστή απαντά στην αρχική ερώτηση: το csv.js μορφοποιεί τις σημειώσεις και η κύρια διεργασία γράφει το notes.csv στον φάκελο λήψεων του χρήστη.
{
"literal_channels": 1,
"renderer_transmissions": 1,
"main_handlers": 1,
"paired_renderer_transmissions": 1,
"ambiguous_renderer_transmissions": 0
}
Καταγράφηκε από το REA 4.1.0 στο παρακάτω παράδειγμα προς λήψη. Τα ευρήματα για το API, το κανάλι και τον χειριστή συνοδεύονται από θέσεις στον πηγαίο κώδικα.
Αναλύστε το παράδειγμα μόνοι σας
Κατεβάστε το παράδειγμα και αποσυμπιέστε το. Το αρχείο περιέχει ολόκληρο τον φάκελο notes-example. Αναλύστε το με Node.js και npm· το Electron δεν χρειάζεται για αυτό το παράδειγμα.
Περιηγηθείτε στα έξι αρχεία πηγαίου κώδικα
npx -y rea-agents@latest analyze-javascript-application \
/absolute/path/to/notes-example --json
Αντικαταστήστε τη διαδρομή με τον φάκελο που αποσυμπιέσατε. Θα πρέπει να βρείτε ένα κανάλι IPC και έναν αντίστοιχο χειριστή στο normalized_result.summary.ipc. Οι θέσεις στον πηγαίο κώδικα βρίσκονται στο normalized_result.graph.
Για τη δική σας εφαρμογή, χρησιμοποιήστε την ίδια εντολή με τον κατάλογό της ή τη διαδρομή ASAR. Ένας βοηθός μπορεί να ακολουθήσει μια κυριολεκτική συμβολοσειρά, ένα όνομα API ή ένα κανάλι IPC με τα εργαλεία ιχνηλάτησης λειτουργιών του REA.
Εξετάστε τον κώδικα εγγραφής CSV
Ακολουθήστε το
notes:exportμέχρι τον χειριστή του. Ποιες είσοδοι φτάνουν στον κώδικα εγγραφής CSV και τι συμβαίνει αν η εγγραφή του αρχείου αποτύχει;
Χρησιμοποιήστε τις θέσεις στον πηγαίο κώδικα για να εξετάσετε αυτές τις λεπτομέρειες. Τα ονόματα καναλιών που υπολογίζονται και οι αμφίσημοι χειριστές μπορεί να παραμείνουν ανεπίλυτα· οι παρατηρήσεις κατά την εκτέλεση σας δίνουν έναν ακόμη τρόπο διερεύνησης.
- Ακολουθήστε τη γέφυρα προχείρου του Notion Εφαρμόστε την ίδια προσέγγιση σε μια συσκευασμένη εφαρμογή Electron.
- Παρατηρήστε μια εξαγωγή στον browserΚαταγράψτε ένα πραγματικό κλικ και δείτε ποιο αίτημα κάνει.
- Ακολουθήστε μια συνάρτηση εγγενούς κώδικαΣυνεχίστε σε ένα δυαδικό αρχείο όταν μια λειτουργία εξαρτάται από εγγενή κώδικα.