Библиотека JavaScript Concatenator для сокрытия данных при модульности

JavaScript Конкатенатор

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

Позвольте мне сначала объяснить проблему. То, что я пытаюсь достичь, это:

Скрытие данных

Под сокрытием данных я подразумеваю такой тип паттерна:

!function(context) {
    var privateObj = {state: 'normal'};
    var privateFunc = function() {alert("I'm private")};

    var toggleState = function() {privateObj.state = 'emergency'};
}(window.myNamespace);

Здесь любопытные пользователи не смогут ни изменять мои личные переменные, ни вызывать мои личные функции.

Модульность

Вышеуказанное работает, пока все находится в одном файле js. Но как только js-файл становится слишком большим, я бы хотел его модульнить:

first.js:

!function(context) {
    var privateObj = {state: 'normal'};
    var privateFunc = function() {alert("I'm private")};
}(window.myNamespace);  

second.js:

!function(context) {
    // This won't work. I can't access privateObj as we are not in same closure
    var toggleState = function() {privateObj.state = 'emergency'};
}(window.myNamespace2);   

Это больше не будет работать. Конечно, я могу поставить toggleState вместе с privateObj но всегда есть необходимость передавать данные между модулями. Это всего лишь иллюстрация.

Это настоящая проблема?

Действительно ли есть случаи, когда мы хотим, чтобы функция была доступна другим модулям, но не была доступна общественности? Я думаю да. Прямой пример:

var chartDrawingMod = function() {
    var drawChart = function(data) {// draw chart with data};
}; 

В этом случае мы все должны согласиться с тем, что

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

  2. Метод drawChart() должен вызываться моим кодом в других модулях для предоставления данных

  3. Мы не хотим, чтобы пользователь произвольно вызывал мой drawChart(), поэтому нежелательно делать его публичным

Проект MathJax столкнулся с этой проблемой. Их решение состоит в том, чтобы использовать сценарий bash для объединения всех сценариев перед развертыванием. Причина, по которой им нужно это сделать, заключается в том, что, во-первых, модули взаимозависимы, поэтому они должны находиться внутри одного и того же файла, а во-вторых, файл слишком велик, чтобы его можно было объединить (30 КБ). Точно такая же проблема здесь, поэтому я считаю, что это реальная проблема.

Предлагаемое решение - JS Concatenator

Положите их в одно закрытие, на лету.

Вот как я себе это представляю. В HTML у меня есть такие:

<script src="concatenator.js"></script>
<script>
    Concat.concateIntoOneClosureWithContext(['/public/js/first.js', '/public/js/second.js'], window.myNamespace);
</script>

Тогда он должен сделать что-то вроде этого:

!function(context) {
    // dump the content of '/public/js/first.js'
    // dump the content of '/public/js/second.js'
}(window.myNamespace);

А также first.js а также second.js урезаны до:

var privateObj = {state: 'normal'};
var privateFunc = function() {alert("I'm private")};

var toggleState = function() {privateObj.state = 'emergency'};

Будет ли это работать?

Будет ли это предлагаемое решение работать? Я упускаю некоторые важные моменты? Каковы потенциальные проблемы? Как я могу сделать это? Любое предложение высоко ценится!

0 ответов

Другие вопросы по тегам