Конкатенатор JavaScript, помогающий скрывать данные при модуляризации?

Ранее я сталкивался с проблемами сокрытия данных при модуляризации в JavaScript. Пожалуйста, смотрите ссылки ниже:

Шаблон модуля - Как разделить код одного модуля на разные файлы js?

JavaScript — извлекать функцию, сохраняя ее приватной

Чтобы проиллюстрировать проблему, см. пример ниже. Моя цель — разделить мой длинный файл js на 2 файла, но некоторым функциям необходимо получить доступ к некоторым закрытым переменным:

first.js:

(function(context) {
    var parentPrivate = 'parentPrivate';
})(window.myGlobalNamespace);

second.js:

(function(context) {
    this.childFunction = console.log('trying to access parent private field: ' + parentPriavte);
}(window.myGlobalNamespace.subNamspace);

Теперь это не сработает, потому что у ребенка нет доступа к родителю. Одно из решений — сделать parentPrivate общедоступным, но в моем случае это неприемлемо.

Цитируя @Louis, который дал ответ на один из предыдущих вопросов:

«У нас не может быть поля, доступного ребенку, но не доступного для посторонних (то есть защищенного). Есть ли способ добиться этого?»

Если вам нужна модульность (т. е. вы хотите, чтобы дочерний элемент кодировался отдельно от родителя), я не верю, что это возможно в JavaScript. Можно было бы, чтобы дочерний и родительский элементы работали в одном и том же замыкании, но тогда это не было бы модульным. Это верно как с RequireJS, так и без него.

Проблема в том, что родитель и дочерний элемент не находятся внутри одного замыкания. Поэтому я думаю, есть ли смысл создавать библиотеку, которая ставит файлы в одно и то же замыкание?

Что-то типа:

concatenator.putIntoOneClosure(["public/js/first.js", "public/js/second.js"]);

Конечно, мы можем использовать больше аргументов для указания пространств имен и т. д. Обратите внимание, что это не та функциональность, которую мы получаем от RequireJS. RequireJS достигает модуляризации, в то время как этот конкатенатор фокусируется на сокрытии данных при условии модульности.

Так имеет ли что-либо из вышеперечисленного смысл? Или я упускаю какие-то важные моменты? Любые мысли приветствуются.


person Boyang    schedule 30.04.2014    source источник


Ответы (1)


Если вам нужны вещи, доступные в двух отдельных файлах, у вас не может быть настоящей конфиденциальности... однако что-то похожее на это может вам подойти:

first.js:

(function(context) {
    var sharedProperties = {
      sharedProp1: "This is shared"
    };

   function alertSharedProp1() {
     alert (sharedProperties.sharedProp1)
   }


   window[context] = { 
     sharedProperties: sharedProperties,
     alertSharedProp1: alertSharedProp1
   };

})("myGlobalNamespace");

второй.js:

(function(parent, context) {
    // CHANGED: `this` doesn't do what you think it does here.

    var childFunction = function() {
      console.log('trying to access parent private field: ' + window.myGlobalNamespace.sharedProperties.sharedProp1);
    };

    window[parent][context] = {
      childFunction: childFunction
    };

}("myGlobalNamespace", "subNamspace"));

window.myGlobalNamespace.subNamspace.childFunction();

Редактировать подробный ответ на основе комментариев

Что я сделал, так это создал исходный файл, который выглядел так:

master.js

(function() {    
   ##include: file1.js##
   ##include: file2.js##    
}());

Затем я написал сценарий (в моем случае в сценариях Windows), который читал master.js, а затем читал строку за строкой в ​​поисках ##include: filename.js## строк. Когда он нашел такую ​​строку, он прочитал включаемый файл и просто выгрузил ее.

Мои особые потребности были особенными, так как я писал плагин для браузера, который должен был работать в трех разных браузерах и должен был быть упакован отдельно, но для моего собственного здравомыслия я хотел, чтобы работали с отдельными файлами.

person Jeremy J Starcher    schedule 30.04.2014
comment
Если я правильно понимаю, вы делаете window.myGlobalNamespace.sharedProperties видимым для всех. Любознательные пользователи могут просто возиться с ним, что нежелательно. Вы говорите you need things available in two separate files, then you can't have true privacy, поэтому я предложил библиотеку конкатенатора, которая объединяет файлы js в один. Имеет ли это смысл? - person Boyang; 30.04.2014
comment
Простая конкатенация не поможет... Вам понадобится что-то более сложное, чтобы взять два файла и обернуть их в модуль. Это возможно — я даже написал один для своего проекта — но это не готовое решение. - person Jeremy J Starcher; 30.04.2014
comment
Понимаю. Это то, что я буду делать. Я понимаю, что это не тривиально (я думаю, что eval() будет задействован), но такая библиотека, однажды написанная, может использоваться везде, как RequireJS. Возможно, я опубликую еще один вопрос, чтобы четко описать это. Спасибо за ваши советы. - person Boyang; 30.04.2014