【问题标题】:Proper method of importing functions导入函数的正确方法
【发布时间】:2021-12-03 21:02:42
【问题描述】:

在学习了一些关于 javascript 承诺及其行为方式的非常有用的提示之后,我正在寻求一些帮助,帮助我将函数从一个 javascript 文件正确导入/导出到另一个通过 NodeJS 运行的文件中。

基本上我希望 basicNode.js 打开一个 html 文档,然后一旦打开(并且通过 open(html) 语句暗示的承诺是 100% 完成/最终确定)运行 change.js 中的函数以更改html 以显示“Hello”代替“Welcome to JavaScript”。这将提供概念证明,然后可以在我的实习期间为处理自动化报告的项目进行推断,因此非常感谢任何帮助

basic.html

<!DOCTYPE html>
<html>  
<head>  
</head>  
<body>
<p>Date/Time: <span id="datetime"></span></p>
  
<p id="here">Welcome to JavaScript</p>  
<form>  
<input type="button" value="click" onclick="changeThis()"/>  
</form>  
</body> 
<script>
var dt = new Date();
    document.getElementById("datetime").innerHTML = dt.toLocaleString();
</script>
<script type="text/javascript" src="change.js"></script> 
<!--
<script>waitForElementToDisplay("#here",function(){alert("Hi");},1000,9000);</script> 
--> 
</html> 

更改.js

function changeThis() {
    document.getElementById("here").innerHTML = "Hello";
}

module.exports={changeThis};

basicNode.js

const open = require('open');
var { change }  = require('./change')
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
global.document = new JSDOM('./basic.html').window.document;

const main = async () => {
  await open('./basic.html');
  change.changeThis();
}

main();

编辑:经过一番修改,这就是我完成任务的方式:在 change.js 中,我设置了以下内容:

const fs = require('fs');
const html = fs.readFileSync('./basic.html');
const dom = new JSDOM(html);

function changeThis() {
console.log("called changeThis() function, should alter the html")
var x = dom.window.document.getElementById('here').textContent;
console.log(x);
dom.window.document.getElementById('here').innerHTML = 'Hello'
var x = dom.window.document.getElementById('here').textContent;
console.log(x);
}

module.exports.changeThis = changeThis

然后,在我的 basicNode.js 文件中调用/导入这个函数:

var change = require('./change');

change.changeThis();

【问题讨论】:

    标签: javascript html node.js


    【解决方案1】:

    在您的change.js-文件中,您将函数导出为命名导出。如果您只从文件中导出一个函数(这不是规则),通常使用命名导出,而命名导出主要用于从文件中导出多个函数时。

    这是一个命名导出

    module.exports= { changeThis };
    

    一个命名的导出被导入为

    var { changeThis }  = require('./change')
    

    与命名导出相反的是默认导出。

    module.exports = changeThis
    

    这是导入为

    var changeThis = require("./change")
    

    编辑: 如果您想要读取文件,修改 DOM,然后再次将其写入文件,那么您可以这样做。

    const jsdom = require('jsdom');
    const { JSDOM } = jsdom;
    
    // Read the file from the system
    const fs = require('fs');
    const html = fs.readFileSync('./basic.html');
    
    // Create a jsdom and modify the file
    const dom = new JSDOM(html);
    dom.window.document.getElementById('here').innerHTML = 'Hello';
    
    // write the file to disc
    fs.writeFileSync(
        './basicUpdated.html',
        dom.window.document.documentElement.outerHTML
    );
    

    【讨论】:

    • 感谢@christianeide 的解释,所以澄清一下:如果我使用第一个导入/导出示例,那么我是否会在代码中通过编写changeThis() 或@987654328 来执行该函数@ 抱歉,如果这看起来很明显,我只使用 NodeJS 2 周,所以调整我的基本 javascript 知识以适应并不是超级微调
    • 不用担心 :) 您只需通过 changeThis() 即可调用函数的以太网方式
    • 甜蜜,看起来它现在正在正确调用该函数。但是,我想可能会回到我之前遇到的承诺问题,我现在从调用中得到一个 can't set properties of null 来更改 html
    • 我不是 100% 确定您要做什么。您的示例正在做两件事,既创建一个虚拟 DOM,又尝试修改 if (Jsdom),同时打开一个带有 open 包的页面。如果您想要读取页面,修改其内容,然后再次将其写入文件,请参阅我的更新答案以获取示例。
    • 我能弄明白,格式化为 module.exports.changeThis = changeThis;然后导入为 var change = require('./change');并调用函数 change.changeThis();
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2023-03-14
    • 2018-06-06
    • 1970-01-01
    • 2018-06-26
    • 2018-02-17
    • 2021-08-10
    • 2019-05-07
    相关资源
    最近更新 更多