@igreklpofrss

Можно ли использовать script и как модуль и как «просто» скрипт?

Приветствую. Не знаю как сформулировать вопрос.. но суть такая. Есть файл request.js в котором написаны функции запроса. Есть service worker расширения, есть content page. Сперва использовал функции запросов в service worker. Теперь, чтобы не писать одно и тоже, хочу использовать эти запросы и на content page. Но проблема заключается в том, что в service worker они импортируются как из модуля. А как их использовать на веб-странице? Возможно ли использовать один файл или какие костыли есть для этого? В общем, вот пример, чтобы было понятней.

Сам reuqests.js файл:
// requests.js
function RequestToSite() {
    return fetch('https://somesite.com').then(function(data) {
        return data.json()
})

export { RequestToSite }
}

Вот как используется в service worker:
// background.js - service_worker
import { RequestToSite } from './requests.js'

async function someFunction() {
    let data = await RequestToSite();
    return data
}

Вот как тестировал, проверял заработает ли в content page:
// index.html - content page
///////////////////////////////////////////////////////////////
// 
// <script type="text/javascript" src="./main.js"></script>
// <script type="text/javascript" src="./script_1.js"></script>
// <script type="text/javascript" src="./script_2.js"></script>
// пытался так 1: функции из requests.js отсутствуют
// и ошибка SyntaxError: Unexpected token 'export' 
// <script type="text/javascript" src="./requests.js"></script>
// пытался так 2: писал в main.js import, но очевидно было, что не заработает.
// <script type="module" src="./requests.js"></script>
////////////////////////////////////////////////////////////////
// main.js
import { RequestToSite } from './requests.js'  // строка использовалась при попытке 2

// использовать RequestToSite из requests.js и тут
async function getSomeData() {
    let data = await RequestToSite()
}
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
@igreklpofrss Автор вопроса
Вдруг кто-то столкнется с подобной ситуацией и наткнется на мой вопрос. Решение достаточно простое: импортировать все модули в отдельном js-файле.
Пример по моему примеру:
// новый js-файл. import_module.js
import { RequestToSite, fn1, fn2 } from './requests.js'
import { fun5, random } from './new_module.js'


window.RequestToSite = RequestToSite;
window.fn1 = fn1;
window.fn2 = fn2;
window.fun5 = fun5;
window.random = random;
// etc..

<!-- HTML страница -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Example</title>
    <script type="module" src="./import_module.js"></script>
</head>
<body>
    <!-- Content of the page -->
</body>
</html>
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@maksam07
Не уверен, но может быть так:
// requests.js
(function(global) {
    function RequestToSite() {
        return fetch('https://somesite.com').then(function(data) {
            return data.json();
        });
    }

    if (typeof module !== 'undefined' && module.exports) {
        module.exports = {
            RequestToSite
        };
    } else {
        global.RequestToSite = RequestToSite;
    }
})(this);


// background.js - service_worker
import { RequestToSite } from './requests.js';

async function someFunction() {
    let data = await RequestToSite();
    return data;
}


<!-- index.html - content page -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Example</title>
    <script type="text/javascript" src="./requests.js"></script>
    <script type="text/javascript" src="./main.js"></script>
</head>
<body>
    <!-- Content of the page -->
</body>
</html>


// main.js
async function getSomeData() {
    let data = await RequestToSite();
    console.log(data);
}

// Вызов функции для проверки
getSomeData();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы