Я ни в коем случае не эксперт, но вот некоторые мысли, которые я высказал по этому поводу. Я не думаю, что вы что-то пропустили (если да, то и я тоже) - я думаю, что это довольно фундаментальная проблема со всеми клиентскими приложениями, будь то скомпилированный исполняемый файл или Javascript.
Конечно, скомпилированный исполняемый файл не особенно мешает ему, потому что он превращен в машинный код, который очень сложно прочитать или декомпилировать во что-нибудь полезное. Однако в Javascript приложение часто обслуживается в том виде, в котором вы его написали, поэтому его легко модифицировать и рассуждать.
Это подводит меня к первому полурешению: запутывание вашего Javascript. Если вы используете инструмент сборки Dojo с параметром shrinksafe, все ненужные пробелы удаляются, а все идентификаторы сокращаются, что затрудняет чтение кода. Я назвал это полурешением, некоторые могут сказать, что даже это придает слишком много значения - я сам все еще думаю, что это стоит делать. В конце концов, сокращенный код также загружается быстрее!
Вторая мера, которую я использую в своих приложениях, состоит в том, чтобы разделить разные части на «слои сборки». Например, в моем профиле сборки у меня будет что-то вроде
dependencies = {
..
layers: [
{ name: "../myApp/Core.js", resourceName: "myApp.Core",
dependencies: ["myApp.Core", "myApp.Foobar"]
},
{ name: "../myApp/modules/Login.js", resourceName: "myApp.modules.Login",
dependencies: ["myApp.modules.Login", "myApp.modules.LoginUi"...],
layerDependencies: ["../myApp/Core.js"]
},
{ name: "../myApp/modules/Secret.js", resourceName: "myApp.modules.Secret",
dependencies: ["myApp.modules.Secret", "myApp.modules.SecretUi"],
layerDependencies: ["../myApp/Core.js"],
authentication: 42
}
]
}
Теперь вместо того, чтобы обслуживать встроенные JS-файлы напрямую в виде статических файлов, я пропускаю запросы через контроллер в моем приложении на стороне сервера, которое проверяет, требует ли уровень JS аутентификации, и зарегистрирован ли пользователь с необходимый доступ.
У этого есть определенные минусы. Файлы JS не кэшируются, и если бы у меня были все мои JS на одном уровне сборки, приложение, вероятно, загрузилось бы немного быстрее. Конечно, есть предел тому, насколько нюансами стоит создавать слои. Больше слоев означает больше хлопот, но и более мелкозернистый доступ к модулю.
Мне было бы интересно услышать, как другие тоже вмешиваются в это. Это хороший вопрос.