亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我可以將 javascript 模塊與“常規”javascript 混合使用嗎?

我可以將 javascript 模塊與“常規”javascript 混合使用嗎?

莫回無 2023-07-06 10:00:33
我有一個頁面設置,它引用了幾個 javascript 文件,并在頁面中內嵌了一些 javascript,這是在加載頁面時生成的。其中一個 JavaScript 文件包含來自第三方庫的類。另一個 javascript 文件包含與頁面相關的各種變量、事件處理程序和函數,它們使用第三方庫 ( var v = new thirdPartyClass(parameters);) 中的類。第三方最近更新了他們的庫并轉而使用模塊,因此現在他們不再提供可用的類,而是提供了可用的類導出。這是我第一次接觸js模塊。因此,據我了解,現在我必須從模塊導入該類,而不是包含 js 文件。當我嘗試這樣做時,我收到一個控制臺錯誤,只有模塊可以導入。我添加type="module"到<script>我的js文件的標簽(它已經添加到第三方js腳本標簽),然后我可以導入他們的類,但現在我的函數無法從頁面(function Uncaught ReferenceError: myFunction is not defined)訪問。我不知道活動是否有效,因為它不會再發展到那么遠了。有什么方法可以使用他們的新導出類,而不必將我的 js 文件完全重組為模塊并更改頁面以使用它?
查看完整描述

4 回答

?
楊__羊羊

TA貢獻1943條經驗 獲得超7個贊

您可以創建一個腳本類型模塊,導入所需的對象并將它們放入窗口中。{您的對象的名稱}如下:


<script type="module">

    import { theItem } from "/path/to/module.js";

    window.theItem = theItem;

</script>

其余代碼可以在常規 js 中。


查看完整回答
反對 回復 2023-07-06
?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

您無法使用 . 在模塊中創建全局變量var。要訪問該函數,您可以將其從文件中導出:


export myFunction;

并將其導入到您需要的文件中:


import {myFunction} from "./relativeFilePath";

或者,如果您想從模塊內創建全局變量,您可以將該變量直接放入對象中window:


window.myFunction = function() {

  //code

};


查看完整回答
反對 回復 2023-07-06
?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

因此,據我了解,現在我必須從模塊導入該類,而不是包含 js 文件。當我嘗試這樣做時,我收到一個控制臺錯誤,只有模塊可以導入。

對于傳統的靜態語句來說確實如此import

但是,值得注意的是,動態import()運算符(另一種導入模塊的異步方式)可用于將模塊導入到經典 javascript 文件以及其他模塊中。

MDN注釋:

import()語法通常稱為動態導入,是一種類似函數的表達式,允許將 ECMAScript 模塊異步動態加載到潛在的非模塊環境中[...]

和:

[...]您可能需要使用動態導入:

  • 當您處于非模塊環境中時(例如 [...]腳本文件)。

例子:


// /my-classic-javascript-file.js


const myAsyncFunction = async () => {

? const { myImportedClass } = await import('/path/to/module.js');

}

查看完整回答
反對 回復 2023-07-06
?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

屬性window設置器解決方案:


<script type="module">

   import Dms from 'https://cdn.jsdelivr.net/npm/[email protected]/dms.js';                 

   alert(Dms.toLat(-3.62, 'dms'));

   window.Dms = Dms;

</script>


<script>

  let Dms;

  Object.defineProperty(window, 'Dms', {

    get(){

      return Dms;

    },

    set(val){

      Dms = val;

      window.dispatchEvent(new Event('dms-set'));

    }

  });

  

  window.addEventListener('dms-set', () => alert('SECOND TIME: ' + Dms.toLat(-3.62, 'dms')));

  

</script>

一些承諾的解決方案:


<script type="module">

   import Dms from 'https://cdn.jsdelivr.net/npm/[email protected]/dms.js';                 

   alert(Dms.toLat(-3.62, 'dms'));

   window.Dms = Dms;

</script>


<script>


  promisifyGlobal('Dms');

  

  Dms.then(Dms => alert('SECOND TIME: ' + Dms.toLat(-3.62, 'dms')));


  function promisifyGlobal(name){

    let global, promise = new Promise(resolve => {

      Object.defineProperty(window, name, {

        get(){

          return promise;

        },

        set(val){

          global = val;

          resolve(global);

        }

      });

    });

  }


</script>

您可以輕松地動態導入到非模塊腳本中:


<script>


  (async () => {

    

    const {default: Dms} = await import('https://cdn.jsdelivr.net/npm/[email protected]/dms.js');

    alert(Dms.toLat(-3.62, 'dms'));

  

  })();


</script>

最后是一些瘋狂的通用解決方案:


<script type="module">


  import Dms from 'https://cdn.jsdelivr.net/npm/[email protected]/dms.js'; 

  alert(Dms.toLat(-3.62, 'dms'));


</script>


<script>


  // this script will handle all imports 

  // tweak to import several exports and named exports


  for(const script of document.querySelectorAll('script[type=module]')) {

    

    const regex = /import\s+([^\s]+)\s+from\s+["\']([^"\']+)/g;

    let matches;

    while(matches = regex.exec(script.textContent)){

      const [, name, url] = matches;

      const src = `import ${name} from '${url}'; export default ${name};`;

      window[name] = new Promise(resolve => {

        import(`data:text/javascript, ${src}`).then(({default:imported}) => {

          setTimeout(() => resolve(imported));

        });

      });

    }


  }


</script>


<script>


  Dms.then(Dms => alert('SECOND TIME: ' + Dms.toLat(-3.62, 'dms')));


</script>


查看完整回答
反對 回復 2023-07-06
  • 4 回答
  • 0 關注
  • 174 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號