Как узнать, является ли переменная глобальной переменной при написании плагина babel - PullRequest
0 голосов
/ 27 ноября 2018

Я хочу написать плагин babel, который блокирует глобальные переменные, такие как document и xhr, из части кода。 Но я не знаю, как определить, принадлежит ли он window.

Пример:

function queryClass(name){
  return document.querySelector(`.${name}`);
  // or return window.document.querySelector(`.${name}`)
}

Я надеюсь, что это превращается в это

function queryClass(name){
  return noDocument.querySelector(`.${name}`);
  // or return window.noDocument.querySelector(`.${name}`)
}

Но я не хочу, чтобы этот код был преобразован:

const document = {querySelector(str){return str + '1'}}
function queryClass(name){
  return document.querySelector(`.${name}`);
  // or return obj.document.querySelector(`.${name}`)
} 

ТакЯ думаю, что я должен научиться судить, если это глобальная переменная.Или есть другой способ помочь мне достичь этого?Это мой простой код Babel:

const babel = require("@babel/core");

const code = `
  function queryClass(name){
    return window.document.querySelector(\`.\${name}\`);
  }
`;

const visitor = {
  Identifier(path) {
    if(path.isIdentifier({name: 'document'})){
      // How to judge if it's a global variable
      path.node.name = 'noDocument';
    }
  }
}

const result = babel.transform(code, {
  plugins: [{visitor}]
});

1 Ответ

0 голосов
/ 27 ноября 2018

Я просто нахожу способ сделать это.

Я не знаю, хорошая ли это идея.

const babel = require("@babel/core");

const code = `
  function queryClass(name){
    return window.document.querySelector(\`.\${name}\`);
  }
`;

const updateParamNameVisitor = {
  Identifier(path) {
    if (path.node.name === this.from) {
      path.replaceWith(this.to);
    }
  }
};

const visitor = {
  Program(path){
    if(path.scope.globals.document){
      const node = path.scope.generateUidIdentifier('no_document');
      path.traverse(updateParamNameVisitor, { from: 'document', to: node })
    }
  }
}

const result = babel.transform(code, {
  plugins: [{visitor}]
});
...