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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

2回答

2498閲覧

vue.jsで非Exportの外部jsファイルをimportする方法を探しています

shimeji_XX

総合スコア42

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2022/11/23 01:08

編集2022/11/23 03:15

前提

Vue + Laravel で SPAのWebシステムを構築しています。
ハンディターミナル(QRコードリーダー)からブラウザを使用し
同一ネットワーク上のサーバーにアクセスしています。
フロントサイドはvue.js、DBとの通信にLaravelを使用しています。

Vue.jsでハンディを提供されている会社様のjava scriptファイルを
読み込みブラウザからハンディの制御を行うつもりです。
ただ、提供されたjsファイルが Export の形ではなく functionべた書きな為
Vue.jsでImportすることができません。

実現したいこと

functionべた書きのjsファイルをVue.jsでImportする方法を探しています。

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

エラーメッセージなし

該当のソースコード

外部jsについては公開が禁止されているため例示
・外部js

Javascript

1var HOGE = HOGE || { 2 Scan: {}, File: {}, FTP: {} 3}; 4 //略 5HOGE.FTP = (function () { 6 //略 7 return { 8 Settings: Settings 9 } 10}()); 11

・index.php(npmで自動生成されたもの)

php

1<?php 2 3use Illuminate\Contracts\Http\Kernel; 4use Illuminate\Http\Request; 5 6define('LARAVEL_START', microtime(true)); 7 8/* 9|-------------------------------------------------------------------------- 10| Check If The Application Is Under Maintenance 11|-------------------------------------------------------------------------- 12| 13| If the application is in maintenance / demo mode via the "down" command 14| we will load this file so that any pre-rendered content can be shown 15| instead of starting the framework, which could cause an exception. 16| 17*/ 18 19if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) { 20 require $maintenance; 21} 22 23/* 24|-------------------------------------------------------------------------- 25| Register The Auto Loader 26|-------------------------------------------------------------------------- 27| 28| Composer provides a convenient, automatically generated class loader for 29| this application. We just need to utilize it! We'll simply require it 30| into the script here so we don't need to manually load our classes. 31| 32*/ 33 34require __DIR__.'/../vendor/autoload.php'; 35 36/* 37|-------------------------------------------------------------------------- 38| Run The Application 39|-------------------------------------------------------------------------- 40| 41| Once we have the application, we can handle the incoming request using 42| the application's HTTP kernel. Then, we will send the response back 43| to this client's browser, allowing them to enjoy our application. 44| 45*/ 46 47$app = require_once __DIR__.'/../bootstrap/app.php'; 48 49$kernel = $app->make(Kernel::class); 50 51$response = $kernel->handle( 52 $request = Request::capture() 53)->send(); 54 55$kernel->terminate($request, $response);

試したこと

Vue.js(vue-cli)にて外部jsライブラリを読み込みたかった…(雑記)

⇒ laravel環境なのでindex.htmlではなくindex.phpになっているため不可能。

お手数をおかけしますが、何か情報ありましたらお願いいたします。

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

@vue/cli 5.0.4
Laravel Framework 9.17.0

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

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

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

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

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

guest

回答2

0

Laravelでフロントを扱うときはlaravel-mixか今ならviteを使うのが普通なので
vue/cliを直接使ってる時点で普通じゃない使い方をしている。
https://laravel.com/docs/9.x/mix
https://laravel.com/docs/9.x/vite

index.phpはLaravelのファイルなのでnpmは何も関係ない。

明らかにLaravelの基礎を理解してない質問なのでそれに合わせた回答。

1 その外部jsをhoge.jsとするとこのファイルはpublic/js/hoge.jsに置く。public内のファイルは http://localhost/js/hoge.js でそのまま表示できる。
2 app.blade.phpでこのhoge.jsを読み込む。普通にindex.htmlで外部jsを読み込んでるのと同じ。Laravelだからと特別なことは何もない。

<script src="{{ asset('js/hoge.js') }}" defer></script> <script src="{{ asset('js/app.js') }}" defer></script>

3 グローバルに読み込んだのでvue内でもwindow.HOGE.FTPで使える。元の外部jsが関数として使えるように作られてないのでwindow.HOGE.FTP()では使えない。後は外部jsの使い方の話。

投稿2022/11/23 09:07

kawax

総合スコア10377

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

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

shimeji_XX

2022/11/24 05:46

回答ありがとうございます。 laravelについて全く理解できていないのはおっしゃる通りです。 最初は webpack.mix.js で読み込んでいましたが、上手くいかなかったためvueから読み込むことを考えました。 (理解がなくlaravel側で読み込んだjsをvueから呼び出せないのだろうかと考えたため) そこで検索した結果 index.html に追加する方法にたどり着いた次第です。 >>1 その外部jsをhoge.jsとするとこのファイルはpublic/js/hoge.jsに置く。public内のファイルは >>http://localhost/js/hoge.js でそのまま表示できる。 >>2 app.blade.phpでこのhoge.jsを読み込む。普通にindex.htmlで外部jsを読み込んでるのと同じ。 >>Laravelだからと特別なことは何もない。 1、2についてpublic/js/hoge.js に置かれていること、public/js/hoge.jsでアクセスできること確認しました。 また、外部js内にaleartの処理を書き確認することで外部jsを読み込むことはできていると認識しています。 >>3 グローバルに読み込んだのでvue内でもwindow.HOGE.FTPで使える。 >>元の外部jsが関数として使えるように作られてないのでwindow.HOGE.FTP()では使えない。 >>後は外部jsの使い方の話。 すみません、ここが良く分かっていないのですが、 index.html と hoge.js(外部js) だけでhttp-serverを動かした場合 <script> function test{ HOGE.FTP.Scan(); } </script> が動作することを確認しました。 もしvueで外部jsを読み込めているのであればvue の<script>内で methods{ hoge{ window.HOGE.FTP.Scan; //もしくは()あり? } } と記載すれば同じ動作になると考えていたのですが実際には Uncaught TypeError: Cannot read properties of undefined (reading 'Scan') となります。この外部jsの呼び出し方に問題があるのでしょうか?
shimeji_XX

2022/11/24 06:30

(追記) 最後のエラーメッセージは Uncaught TypeError: window.HOGE.FTP.Scan is not a function でした。 失礼しました。
guest

0

importせずに、JavaScriptはHTMLから別途読み込んでwindow.HOGEの形で呼び出しておく、という方法でとりあえず対応してみてはどうでしょうか。

投稿2022/11/23 01:27

maisumakun

総合スコア145184

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

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

shimeji_XX

2022/11/23 02:10

回答ありがとうございます! 深く理解しているわけではないので認識に相違があったら申し訳ないのですが、 https://www.letitride.jp/entry/2020/04/18/121809 のように piblic/html で読み込んでwindowで呼び出すという認識で間違いないでしょうか? ただ、今回index.php から .vue の単一コンポーネントに飛んでいるためhtmlで呼び出す機会がないような気がします…。 .vueの場合html部の<template>内に<script>を生成できない仕様の為 .vue では読み込めないです。 単一コンポーネントを分割すればhtmlに書き込めるのでしょうか? 分割はやったことがないですが検証してみます。
maisumakun

2022/11/23 02:56 編集

> ただ、今回index.php から .vue の単一コンポーネントに飛んでいるためhtmlで呼び出す機会がないような気がします…。 index.phpにvueの呼び出しを書いているのであれば、PHPサイドで同じビューの中に<script>を追加することも可能かと思うのですが、そういう構造ではないのでしょうか?
shimeji_XX

2022/11/23 04:22

すみません、言葉が足りませんでした。 index.php は npm で vue/laravel プロジェクトを作成した際に自動生成されるファイルで一般的なhtmlファイルの形式をしていないファイル(本文中にプログラム追記、laravel書式でのプログラム)です。 なんやかんやあって/routes の web.phpから Route::get('/{any?}', function () { return view('app'); })->where('any', '^(?!api\/)[\/\w\.-]*'); のような形で /resources/views のapp.blade.php を読み込みます。 このapp.blade.phpが <!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Testステム</title> <!-- Fonts --> <link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap" rel="stylesheet"> <!-- Styles --> <style> /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}a{background-color:transparent}[hidden]{display:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}a{color:inherit;text-decoration:inherit}svg,video{display:block;vertical-align:middle}video{max-width:100%;height:auto}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-t{border-top-width:1px}.flex{display:flex}.grid{display:grid}.hidden{display:none}.items-center{align-items:center}.justify-center{justify-content:center}.font-semibold{font-weight:600}.h-5{height:1.25rem}.h-8{height:2rem}.h-16{height:4rem}.text-sm{font-size:.875rem}.text-lg{font-size:1.125rem}.leading-7{line-height:1.75rem}.mx-auto{margin-left:auto;margin-right:auto}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-2{margin-left:.5rem}.mt-4{margin-top:1rem}.ml-4{margin-left:1rem}.mt-8{margin-top:2rem}.ml-12{margin-left:3rem}.-mt-px{margin-top:-1px}.max-w-6xl{max-width:72rem}.min-h-screen{min-height:100vh}.overflow-hidden{overflow:hidden}.p-6{padding:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.pt-8{padding-top:2rem}.fixed{position:fixed}.relative{position:relative}.top-0{top:0}.right-0{right:0}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.text-center{text-align:center}.text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.underline{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.w-5{width:1.25rem}.w-8{width:2rem}.w-auto{width:auto}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width:640px){.sm\:rounded-lg{border-radius:.5rem}.sm\:block{display:block}.sm\:items-center{align-items:center}.sm\:justify-start{justify-content:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:h-20{height:5rem}.sm\:ml-0{margin-left:0}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pt-0{padding-top:0}.sm\:text-left{text-align:left}.sm\:text-right{text-align:right}}@media (min-width:768px){.md\:border-t-0{border-top-width:0}.md\:border-l{border-left-width:1px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\:px-8{padding-left:2rem;padding-right:2rem}}@media (prefers-color-scheme:dark){.dark\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.dark\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.dark\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.dark\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.dark\:text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.dark\:text-gray-500{--tw-text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--tw-text-opacity))}} </style> <style> body { font-family: 'Nunito', sans-serif; } </style> <script src="{{ asset('js/app.js') }}" defer></script> </head> <body> <div id="app"> <header-component></header-component> <router-view></router-view> <div> </body> </html> のようにhtml になっていることを確認したのでここに追加して利用できるか試してみます。
shimeji_XX

2022/11/23 06:13

うーーーん https://kbn1053.hatenablog.com/entry/2018/04/21/001651 を参考にしてapp.blade.phpに <script src="{{ asset('js/app.js') }}" defer></script> <script src="{{ asset('js/test.js') }}" ></script> //追加分 と追記して .vueから test.js内のwindow.myFunc() を呼び出してみましたが 以下エラーのように認識されていないようです。 Uncaught (in promise) TypeError: window.myFunc is not a function お手上げです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問