как webpack решает проблему глобального загрязнения?

#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. В том, что вы говорите, есть смысл.