質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

667閲覧

別サイトにあるJSでのモジュール使用でCORSエラーとなる

CTRL-S

総合スコア195

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2024/06/26 19:20

実現したいこと

あるJSをモジュールを導入して改良しようとしています。
ですが、使用するHTMLのあるサイトとJSを置くサーバーが別ドメインの為、後述のサンプルのような場合、CORSエラーが発生します。

前提

HTML、JS共にライブドアブログの為、
Access-Control-Allow-Origin ヘッダを付ける事ができません。
これ以外の解決方法はありますでしょうか?

HTMLとmodule.jsがクロスドメインなのは分かりますが、
そもそもmain.jsが実行できるのに、そこから同ドメインにあるモジュールを実行するのにCORSが必要な意味がわかりません。

発生している問題・エラーメッセージ

該当のソースコード

HTML

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> 5<title>モジュールテスト</title> 6<script defer src="https://js-serv.xxx/main.js"></script> 7</head> 8<body> 9 10<button id="btn" type="button">ボタン</button> 11 12</body> 13</html>

https://js-serv.xxx/main.js

JavaScript

1'use strict'; 2window['btn'].addEventListener('click', async e => { 3 let mod = await import('./module.js'); 4 alert(mod.say()); 5}, false);

https://js-serv.xxx/module.js

JavaScript

1let name = '太郎'; 2let age = 30; 3function say () { 4 return `${name}${age}歳です`; 5} 6 7export {name, age, say};

試したこと

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

HTMLとmodule.jsがクロスドメインなのは分かりますが、
そもそもmain.jsが実行できるのに、そこから同ドメインにあるモジュールを実行するのにCORSが必要な意味がわかりません。

残念ながら、そういう仕様です(WHATWG)。import()で呼ぶスクリプトに対しては、HTMLのオリジンを基準としてCORSが適用されます。

モジュールでない<script>は、CORSより前から存在する関係上、クロスオリジンでも問題なく実行されてしまいます。

投稿2024/06/27 00:01

maisumakun

総合スコア146618

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CTRL-S

2024/06/27 20:01

回答ありがとうございます。 やはり他の方法は無さそうですね。 ちょっとクセのあるモジュールの仕様をだいたい理解して、さあ改良しようかと思った矢先に思わぬ落とし穴で残念です。 モジュールの導入は諦めます。
yambejp

2024/06/28 00:07

>モジュールの導入は諦めます。 他サイトのものを直接参照して使わなければいいだけの話では?
guest

0

すでにご自身で理解している通りmoduleは無条件にCORSを超えることはできません
設定をするか諦めるかのどちらかです。
趣旨は違いますがmoduleがだめならクラスで代替するとかやり方次第でしょうね

html

1<script src="https://example.com/main.js"></script> 2<button id="btn" type="button">ボタン</button>

https://example.com/main.js

javascript

1window.addEventListener('DOMContentLoaded', ()=>{ 2 document.head.appendChild(Object.assign(document.createElement('script'),{src:"https://example.com/module.js"})); 3}); 4document.addEventListener('click',({target})=>{ 5 if(target.matches('#btn')){ 6 let mod = new mymodule; 7 alert(mod.say()); 8 } 9});

https://example.com/module.js

javascript

1class mymodule{ 2 name = '太郎'; 3 age = 30; 4 say () { 5 return `${this.name}${this.age}歳です`; 6 } 7}

投稿2024/06/27 01:16

yambejp

総合スコア117755

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CTRL-S

2024/06/27 20:02

回答ありがとうございます。 ベストアンサーは別の方を選ばせていただきましたが、こちらの回答も非常に参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問