Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Как правильно писать библиотеку?

#javascript


Пишу скрипт показа сообщения
.Файл notify.js:

;(function(){
    function Notify(titleText, messageText) {

        var notify = document.createElement("div");
        notify.className = "notify";
        var title = document.createElement("div");
        title.className = "notify title";
        title.innerHTML = titleText;
        var message = document.createElement("div");
        message.className = "notify message";
        message.innerHTML = messageText;

        notify.appendChild(title);
        notify.appendChild(message);
        function show(){
        document.body.appendChild(notify);
        }
  }
})();


При подключении скрипта в index.html и при вызове Notify("title","message").show()
ошибка Notify is not defined и это понятно, но как по-другому писать, чтобы не было
конфликтов с локальными скриптами?
Много ошибок допускаю, скажите, какие? Как правильно организовать код, писать библиотеку?
    


Ответы

Ответ 1



У Вас код локально создался и... умер, т. к. при завершении функции, её окружение уничтожается. Исключение - замыкание (например, ссылка на какие-то данные сохраняется и после завершения работы). // В параметрах передаём модуль и this (глобальный объект, не обязательно window) (function(myModule, global){ // Если есть система зависимостей AMD, добавляем модуль туда if(typeof define === "function" && define.amd) define("logger", [], () => myModule()); // Если же это RequireJS, не будем идти против воли Творца :) else if(typeof module !== 'undefined' && module.exports) module.exports = myModule(); // Если систем сборки нет, значит экспортируем в глобальный объект else global['logger'] = myModule(); }(function(){ let myModule = _ => console.info(`Вывод '${_}' через модуль`); return myModule; }, this)); // Сработает 3-я ветка экспорта logger('Test'); Но стандарт устанавливает более интересную конструкцию для модулей, рекомендую с ней ознакомится.

Ответ 2



Notify у вас определён в области видимости внутри кложуры, его не видно снаружи. В вашем случае может подойти паттерн модуль, тогда из функции возвращается объект. Но вообще, сейчас в ECMAScript есть стандарт модулей. Это будет работать, если использовать что-то вроде Babel. Также можно использовать CommonJS require.

Комментариев нет:

Отправить комментарий