#javascript #webpack #module #namespaces
#javascript #webpack #модуль #пространства имен
Вопрос:
Допустим, у меня есть 3 функции. Если я напишу их все один за другим, друг под другом, все они будут доступны для глобального пространства имен, отсюда и глобальная поляризация. Итак, один из способов, по-видимому, следующий.
var test;
(function() {
test.funct1 = function(){
}
test.funct2 = function(){
}
test.funct3 = function(){
}
})
Теперь мы уменьшили проблему, поскольку функции не помещаются в глобальное пространство имен. Мы могли бы сказать, что они все еще существуют, но не полностью. test
будет помещен в глобальный namespace
, на котором будут все другие функции.
Вопрос 1) Теперь проблема все еще существует, если у кого-то или какой-то библиотеки есть test
, проблема в том, что мои test
и библиотеки test
столкнутся, что кажется слишком плохим. Как люди решают это без какой-либо библиотеки / фреймворка или чего-либо еще (без webpack)?
Вопрос 2) Хорошо, итак, webpack решает вышеуказанную проблему. В webpack каждый файл является модулем. Это понятно, но, тем не менее, хороший хороший пример был бы отличным, некоторые вещи все еще нужно поместить в глобальную область. Я был бы признателен за хороший хороший пример.
Комментарии:
1. Пожалуйста, попробуйте задать только один вопрос в вопросе
2. Они почти связаны, и, кажется, лучше спросить об этом так
Ответ №1:
Теперь проблема все еще существует, если у кого-то или какой-то библиотеки есть test , проблема заключается в том, что мой тест и тест библиотеки столкнутся, что кажется слишком плохим. Как люди решают это без какой-либо библиотеки / фреймворка или чего-либо еще (без webpack)?
Объявите test
only внутри области видимости, где это необходимо; не делайте его глобальным. Например, вы могли бы:
<script>
(() => {
const test = {
funct1() {
// ...
}
// ...
};
// do stuff with test
})();
(() => {
const test = {
OTHER_METHOD() {
// ...
}
// ...
};
// do stuff with test
})();
</script>
Таким образом, ни test
один из них не является глобальным; они оба заключены в свой собственный IIFE, и все виды использования конкретного test
будут находиться внутри этого IIFE.
некоторые вещи все еще нужно поместить в глобальную область
Весь смысл модульной системы, такой как Webpack, заключается в том, чтобы избежать необходимости загрязнять глобальный объект; если ваш код структурирован разумно, в этом не должно быть никакой необходимости. Но если бы вам пришлось, просто обратитесь к глобальному объекту и присвоите одному из его свойств, например:
// someModule.js
window.SomethingGlobal = {
// stuff
};
Это не относится конкретно к Webpack; такой же точный подход к снижению глобального загрязнения доступен в модулях ES6
Комментарии:
1. Спасибо за ответ. Если webpack ничего не помещает в глобальный объект, как это может быть возможно? Допустим, я использую Vue. Это все еще не в глобальной области. Где это? Объект Vue по-прежнему должен быть глобальным, поскольку он используется во всем приложении
2. Представьте любой сценарий, который вы можете придумать. Затем поместите все его содержимое в IIFE. Тогда ничто в этом скрипте не будет глобальным! (если это не сделано где-то явно с
window.someprop = someval
помощью) IIFEs предотвращают неявное глобальное загрязнение.3. В том, что вы говорите, есть смысл.