Импорт require.js в расширение Chrome

Я создаю расширение и начал с руководства для разработчиков Chrome. Я хочу очистить веб-страницу и получить всплывающее окно, если цена достигнет значения X.

Чтобы заставить это работать, мне нужно импортировать "cheerio". Я видел много вопросов, похожих на этот, загрузил require.js в папку lib, включенную в манифест ... но я не могу понять обходной путь:

Это мой html:

<!DOCTYPE html>
<html>
  <head>
    <style>
      button {
        height: 30px;
        width: 30px;
        outline: none;
        margin: 10px;
      }
    </style>
  </head>
  <body>
    <div id = "buttonDiv">
    </div>
  </body>
  <script src = "options.js"></script>
</html>

Это мой манифест:

{
    "name": "PriceTracker",
    "version": "1.0",
    "description": "Track your wishlist!",
    "permissions": ["activeTab", "declarativeContent", "storage"],
    "background": {
        "scripts": ["background.js","lib/require.js"],
        "persistent": false
      },
      "options_page": "options.html",
      "page_action": {
        "default_popup": "popup.html",
        "default_icon": {
          "16": "images/get_started16.png",
          "32": "images/get_started32.png",
          "48": "images/get_started48.png",
          "128": "images/get_started128.png"
        }
      },
      "icons": {
        "16": "images/get_started16.png",
        "32": "images/get_started32.png",
        "48": "images/get_started48.png",
        "128": "images/get_started128.png"
      },

    "manifest_version": 2
  }

Это background.js:

'use strict';

// tested this and no success
function loadScript(scriptName, callback) {
    var scriptEl = document.createElement('script');
    scriptEl.src = chrome.extension.getURL('lib/' + scriptName + '.js');
    scriptEl.addEventListener('load', callback, false);
    document.head.appendChild(scriptEl);
  }




  
chrome.runtime.onInstalled.addListener(function() {
  chrome.storage.sync.set({color: '#3aa757'}, function() {
    console.info("The color is green.");
  });

  chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
    chrome.declarativeContent.onPageChanged.addRules([{
      conditions: [new chrome.declarativeContent.PageStateMatcher({
        pageUrl: {hostEquals: 'developer.chrome.com'},
      })
      ],
          actions: [new chrome.declarativeContent.ShowPageAction()]
    }]);
  });

});

и это options.js:

'use strict';

let page = document.getElementById('buttonDiv');

const kButtonColors = ['#3aa757', '#e8453c', '#f9bb2d', '#4688f1'];

function constructOptions(kButtonColors) {
  for (let item of kButtonColors) {
    let button = document.createElement('button');
    button.style.backgroundColor = item;
    button.addEventListener('click', function () {
      chrome.storage.sync.set({ color: item }, function () {
        console.info('color is ' + item);
      })
    });
    page.appendChild(button);
  }
}
constructOptions(kButtonColors);


function getData(url) {
  loadScript("require");
  let cheerio = require('cheerio'); //<-- this is where I get the non existent "require"
  let jsonframe = require('jsonframe-cheerio');

  let $ = cheerio.load(url);
  jsonframe($); // initializes the plugin

  var frame = { ...... };

  var gamesList = $('.offerDetails.category.row').scrape(frame);
  console.info(gamesList); // Output the data in the terminal
}

getData("URLTOPARSE");

Я получаю знаменитую "Uncaught ReferenceError: require is not defined" ... Есть идеи, что я делаю не так?

Вам нужно использовать упаковщик. Узнайте о модульных системах JavaScript.

SLaks 06.12.2018 01:28

Вам не нужно приветствовать это, вам нужен jQuery.

pguardiario 06.12.2018 01:48

1) Загрузка <script> является асинхронной, поэтому require не определен в текущей запущенной функции, вам следует дождаться события загрузки скрипта. 2) Фоновый скрипт выполняется на отдельной скрытой фоновой странице, поэтому вы не можете использовать его функции напрямую. И если вы включили background.js в popup.html, это неправильно - вам нужно извлечь функцию в общий js-файл, а затем включить ее как во всплывающий html, так и в ключ фоновых «скриптов» в manifest.json. 3) Но вам вообще не нужен loadScript - вы можете просто включить require.js в свой всплывающий html.

wOxxOm 06.12.2018 05:51

Пробовал это - «Но вам вообще не нужен loadScript - вы можете просто включить require.js в свой всплывающий html». и никакого успеха ... Теперь я получаю "Неперехваченная ошибка: имя модуля" cheerio "еще не загружено для контекста: _. Используйте require ([])" Погуглить ...

Eunito 06.12.2018 10:35

Для того, чтобы require работал, фактические скрипты должны быть загружены заранее, чтобы они зарегистрировались во внутренней карте требования. Вместо использования require вы, вероятно, можете просто загрузить эти сценарии прямо во всплывающем html.

wOxxOm 06.12.2018 18:51
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
5
330
0

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