2017-05-12 2 views
3

Je voudrais charger un module javascript dans JavascriptCore (sur iOS).Chargement du module AMD dans JavaScriptCore

Je récupère le texte du fichier via une requête HTTP normale du côté iOS. Donc je peux analyser cette chaîne entière dans le JScontext.

Mais maintenant je voudrais charger ce module, et idéalement, résoudre toutes les autres dépendances, bien que ce ne soit pas essentiel.

J'ai essayé using requireJS pour le noeud, mais il semble avoir beaucoup d'erreurs de dépendance, et c'est peut-être un peu démodé.

J'ai aussi essayé de voler, mais je ne suis pas sûr que ce soit le bon chemin non plus. J'ai aussi essayé ça. Essentiellement je veux faire ce que js fait dans le navigateur, mais dans un environnement javascript pur (pas de navigateur, pas de noeud).

Je veux aussi regrouper tout bas à l'aide browserify, et ont regardé des choses comme ça - RequireJS load string

Le problème est, quand je vais à browserify le code, (nécessitant, requirejs) le processus échoue avec les dépendances non trouvées ?

Quelqu'un peut-il me diriger dans la bonne direction?

Répondre

4

Les technologies que vous évoquez ne sont pas complètement compatibles entre elles. Considérez une ligne comme require('meow'). Avec browserify/webpack/etc le fichier qui sera chargé est node_modules/meow/main.js (en fonction de ce que package.json dit est le fichier principal). Dans requirejs, ce même fichier chargera le chemin /meow via le navigateur ou depuis la racine baseUrl de votre projet. Le moyen de surcharger ceci est d'ajouter des options de configuration dans requirejs. C'est vraiment pénible car cela vous oblige à créer une entrée pour chaque paquet dans node_modules. En bref, vous ne pouvez pas vraiment combiner requirejs et browserify sans beaucoup de travail.

Pour configurer le fractionnement de code à l'aide de browserify ou de webpack, vous devez définir un nouveau point d'entrée pour l'ensemble. Ensuite, lorsque vous le chargez à partir de votre application, vous devez charger ce paquet js en faisant quelque chose comme fetch('https://myserver.com/bundle2.js').then().... Il existe une poignée d'outils qui peuvent vous aider à le faire en utilisant webpack ou browserify.

  1. Certaines stratégies avec Browserify - http://esa-matti.suuronen.org/blog/2013/04/15/asynchronous-module-loading-with-browserify/
  2. Webpack - https://webpack.github.io/docs/code-splitting.html

L'histoire du web est pas très bien autour de ce moment (à partir de 2017). La plupart des systèmes le font de manière personnalisée.

+0

Merci pour les commentaires! Ai-je raison de dire que, en termes de javascriptcore, je vais devoir écrire mon propre chargeur asynchrone? Je ne m'intéresse principalement qu'à JScore ou à un équivalent androïde, car requirejs fonctionne parfaitement pour moi dans le navigateur en ce moment. Je suis actuellement en train de charger dynamiquement des chemins personnalisés pour chaque module (afin de pouvoir rediriger les modules sur des serveurs différents, en fonction de l'environnement) et cela fonctionne bien. Savez-vous quelque chose sur la construction de votre propre chargeur de module, et comment cela serait différent par rapport à l'utilisation d'Eval? –

+0

Oh oui tout à fait. Check this out: https://github.com/parris/twitch_stream_search/blob/master/src/utils/simpleRequire.js#L24 J'ai fondamentalement fait mon propre chargeur de module complètement asynchrone ici. N'hésitez pas à lire le reste de la bibliothèque pour obtenir une image plus complète.C'est fondamentalement un environnement exigeant-comme dans juste quelques lignes. Maintenant, un autre problème que vous pourriez avoir est que vous ne pouvez pas charger les fichiers localement en utilisant le protocole file: //. Si vous chargez à partir d'un serveur, cela devrait fonctionner. Voir cette réponse SO: https://stackoverflow.com/questions/20829481/ajax-code-without-web-server – Parris