11488 sujets

JavaScript, DOM et API Web HTML5

Modérateur
Et l'eau tout le monde,

J'ai un petit souci avec les taskrunner (Webpack/Grunt) et le module uglify. Je viens de créer une librairie avec ses propres dépendances (la librairie peut fonctionner sans librairie externe (npm i -D unModule)). Au final, j'ai une class qui est une façade. Lorsque je minifies toute la librairie, j'obtiens un "min.js". Mais là où je suis coincé, j'essaie d'intancier la librairie depuis l'extérieur du fichier, j'obtiens le nom de la librairie en undefined. Pour illustrer mon propos, voici le code :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script src="min.js"></script>
    <script>
        let monInstance = new MonObjet(); //MonObjet undefined 
    </script>
</body>
</html>


Voici la config de l'un des taskrunner que j'utilise :

uglify: {
            options: {
                mangle: true,
                compress: {
                    sequences: true,
                    dead_code: true,
                    conditionals: true,
                    booleans: true,
                    unused: true,
                    if_return: true,
                    join_vars: true,
                    drop_console: true
                }
            },
            my_target: {
                files: {
                    '../js/min.js': [
                        'js/app.js'
                    ]
                }
            }
        },


Savez vous comment faire pour que le fichier min.js soit standalone ?

Merci de vos lumières
Modifié par niuxe (05 Feb 2019 - 18:15)
bonjour

le fait que MonObjet soit undefined au moment ou tu l'appelle montre que cet classe n'existe pas encore a ce moment, ou qu'elle existe mais pas sur window

des idées:
le fichier js qui contient MonObjet est bien declaré avant son utilisation ?
il faudrait savoir comment est déclarer la classe MonObjet
-si c'est dans un closure et sans namespace, tu n'y auras pas acces de l'exterieur
-si c'est dans un namespace alors il faut l'utiliser


a+
Modérateur
Et l'eau,

la façade est déclarée comme ceci :

import Polyfills from '../Polyfills';
import Configuration from '../configuration/Configuration';
import UneClasse from '../element/uneClass';
import UneAutreClasse from './uneAutreClasse';

export default class MonObjet{
// etc.
}

Modifié par niuxe (13 Feb 2019 - 12:24)
salut

ok donc il faudrait voir a quoi ressemble le fichier js final (parce que la comme ca je sais pas trop comment c'est exporté)
regarde ton fichier js minifié et cherche la definition de MonObjet dedans

post le js minifié

a+