【问题标题】:Having issue with extending JavaScript class in another JavaScript file - GULP在另一个 JavaScript 文件中扩展 JavaScript 类时遇到问题 - GULP
【发布时间】:2020-12-19 07:07:11
【问题描述】:

我正在创建一个简单的待办事项列表项目。其中,我有两个 HTML 文件和两个 javascript 文件。

  1. index.html script.js
  2. todoDetails.html todoDetail_script.js

在我的 script.js 中,我有一个名为“Store”的类,用于所有本地存储方法。

class Store{

    static getTodos() {
        let todos;

        if(localStorage.getItem('todos') == null) {
            todos = [];
        }
        else {
            todos = JSON.parse(localStorage.getItem('todos'));
        }

        return todos;
    }

    static addTodos(todo) {
        const todos = Store.getTodos();
        todos.push(todo);
        localStorage.setItem('todos', JSON.stringify(todos));
    }

    static removeTodo(taskName){
        const todos = Store.getTodos();

        todos.forEach((todo, index) => {
            if(todo.task === taskName)
            {
                todos.splice(index, 1);
            }
        });

        localStorage.setItem('todos', JSON.stringify(todos));
    }

    static showTodoDetail(taskName){
        window.location = 'todoDetail.html?taskName=' + taskName;
    }
}

在我的 todoDetail_script.js 中,我想扩展一个“Stroe”类来访问“getTodos()”方法。

class UI1 extends Store {
    static displayTodolist() {
       
        const todos = Store.getTodos(); 

        const queryString = window.location.search;
        const urlParams = new URLSearchParams(queryString);
        var taskName = urlParams.get('taskName');


        todos.forEach((todo) => {
            if(todo.task == taskName) {
                document.getElementById('task_name').value = todo.task;
                document.getElementById('priority').value = todo.priority;
                document.getElementById('due_date').value = todo.duedate;
                document.getElementById('task_status').value = todo.status;
            }
        });
    }
}

document.addEventListener('DOMContentLoaded',UI1.displayTodolist());

我正在努力将 script.js 与 toDetails_script.js 链接起来。 script.js 也有许多其他类。我只想在 toDetail_script.js 中导入 script.js 文件。

我试过 GULP。我不知道哪个 npm gulp 依赖可以帮助我解决这个问题。

有人知道如何提供帮助吗?

【问题讨论】:

  • 您遇到的错误是什么?你是如何导入script.js 的?这是在浏览器环境中运行的吗?
  • 确保在另一个 js 文件中导入带有 type="module" 的 script.js
  • 我尝试了 GULP,使用 npm 安装了 gulp-import 依赖项,并在 gulpfile.js 中编写了导入代码,但它只是在 todoDetail_script.js 中导入 script.js 代码,并将其形成为一个名为 todoDetails_script 的单个文件。 js 在目标文件夹中。
  • 我在浏览器中直接打开 HTML 文件

标签: javascript html gulp


【解决方案1】:

所以你需要做几件事

首先你需要在 Store 类前面添加导出默认值

export default class Store{

static getTodos() {
    let todos;

    if(localStorage.getItem('todos') == null) {
        todos = [];
    }
    else {
        todos = JSON.parse(localStorage.getItem('todos'));
    }

    return todos;
}

static addTodos(todo) {
    const todos = Store.getTodos();
    todos.push(todo);
    localStorage.setItem('todos', JSON.stringify(todos));
}

static removeTodo(taskName){
    const todos = Store.getTodos();

    todos.forEach((todo, index) => {
        if(todo.task === taskName)
        {
            todos.splice(index, 1);
        }
    });

    localStorage.setItem('todos', JSON.stringify(todos));
}

 static showTodoDetail(taskName){
     window.location = 'todoDetail.html?taskName=' + taskName;
 }
}

然后在 todoDetail_script.js 你需要写在顶部

import Store from 'here write the path to script.js'

然后在 todoDetail_script.js 你可以使用

Store.getTodos();

在包含此 toDetail_script.js 的 html 文件中,除了 src 属性之外,还要添加 type="module" 属性。

注意:这是一个 ES6 模块功能,只能在 localhost 或 webserver 上使用,如果您直接在浏览器中打开 html,则无法使用。

要创建网络服务器,您可以使用此 chrome 扩展程序

https://chrome.google.com/webstore/detail/web-server-for-chrome/ofhbbkphhbklhfoeikjpcbhemlocgigb/related?hl=en



 

【讨论】:

  • 当我这样做时,我收到了这个错误“Uncaught SyntaxError: Unexpected token 'export'”
  • 你是对的,我试图在浏览器中直接打开 html 文件。通过添加任何扩展名是否还有其他可能性来做到这一点。我尝试了 GULP,因为我完成了“npm install gulp-imports”,但它对我没有帮助。它只是连接两个文件,感谢您的详细解释,这对我有很大帮助。
  • @priya 你能把 script.js 包含在 todo html 文件中吗?如果可以的话,我们可以让它运行得非常简单吗?
  • 我的动机不是在 todoDetail.html 中包含 script.js。它只包含 todoDetail_script.js。
  • 您好,我按照您上面所说的做了,但收到错误“未捕获的语法错误:请求的模块 './script.js' 不提供名为 'Store' 的导出”。我在 todoDetail_script.s 中包含了 import 语句,例如“import { Store } from './script.js';”
【解决方案2】:

从我的快速测试中,我发现创建类的对象更容易。所以在 todoDetail 中我会创建一个 Store 的实例:var miniStore = new Store(),然后你可以使用 miniStore 调用 Store 的方法,例如:miniStore.addTodos(x)

【讨论】:

    【解决方案3】:

    todoDetail_script.js 很可能在script.js 之前执行,因此当您的页面加载时,您应该在控制台中获得Uncaught ReferenceError: Store is not defined

    解决这个问题的最快方法是使用defer来确保您的文件以正确的顺序执行。

    您可以阅读更多here

    试试这个:

    <script src="path/to/your/js/files/script.js" defer></script>
    <script src="path/to/your/js/files/todoDetail_script.js" defer></script>
    

    【讨论】:

    • 我在两个不同的 HTML 文件中编写了脚本标签,我在 localhost 上运行它。特别是它不是 ES6 模块。我们将如何在 todoDeatil_script.js 中导入 script.js?
    • @priya 我从来没有提到过 ES6 模块。您可以 a) 在 HTML 文件中使用 2 个脚本标签,如上所示,或 b) 使用 gulp、npm、yarn 等工具将所有文件合并为一个。最快的方法是选择选项a。最容易维护的就是去 b。
    • 谢谢。我尝试了 GULP,在那里,我完成了“npm install gulp-imports”,但它对我没有帮助。它只是连接两个文件。是否有任何其他 GULP 依赖项可以帮助我在 todoDetail_script.js 中导入 script.js?我需要的是我需要在 todoDetail_script.js 顶部包含 import(script.js) 以访问任何特定类的 script.js 文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多