Collega ed esegui file JavaScript esterno ospitato su GitHub


546

Quando provo a cambiare il riferimento collegato di un file JavaScript locale in una versione raw di GitHub, il mio file di test smette di funzionare. L'errore è:

Si è rifiutato di eseguire lo script da ... perché il suo tipo MIME ( text/plain) non è eseguibile e il controllo rigoroso del tipo MIME è abilitato.

Esiste un modo per disabilitare questo comportamento o esiste un servizio che consente il collegamento a file raw GitHub?

Codice di lavoro:

<script src="bootstrap-wysiwyg.js"></script>

Codice non funzionante:

<script src="https://raw.github.com/mindmup/bootstrap-wysiwyg/master/bootstrap-wysiwyg.js"></script>

3
rawgit.com è ora il nuovo dominio
Muhammad Umer,


1
@MuhammadUmer - solo se i tuoi file sorgente non cambiano mai . rawgitla cache non si aggiorna mai .
vsync,

3
2019: SALTA SOLO TUTTE LE RISPOSTE MENTIONING RAW O RAWGIT. Rawgit è morto. Scendi alla risposta da chharwey e votala fino a quando non arriva in cima. Questo è quello buono: il più semplice, che utilizza l'approccio preferito ufficiale di GitHub.
Marco Faustinelli,

Risposte:


1018

V'è una buona soluzione per questo, ora, utilizzando jsdelivr.net .

Passaggi :

  1. Trova il tuo link su GitHub e fai clic sulla versione "Raw".
  2. Copia l'URL.
  3. Cambia raw.githubusercontent.comincdn.jsdelivr.net
  4. Inserisci /gh/prima del tuo nome utente.
  5. Rimuovi il branchnome
  6. (Facoltativo) Inserisci la versione a cui desideri collegarti, poiché @version(in caso contrario, otterrai l' ultima versione , che potrebbe causare la memorizzazione nella cache a lungo termine)

Esempi :

http://raw.githubusercontent.com/<username>/<repo>/<branch>/path/to/file.js

Usa questo URL per ottenere l'ultima versione:

http://cdn.jsdelivr.net/gh/<username>/<repo>/path/to/file.js

Utilizza questo URL per ottenere una versione specifica o eseguire il commit dell'hash:

http://cdn.jsdelivr.net/gh/<username>/<repo>@<version or hash>/path/to/file.js

Per gli ambienti di produzione , prendere in considerazione il targeting di un tag specifico o commit-hash anziché il ramo. L'uso dell'ultimo collegamento può comportare la memorizzazione nella cache a lungo termine del file, impedendo l'aggiornamento del collegamento quando si inviano nuove versioni. Il collegamento a un file tramite commit-hash o tag rende il collegamento univoco per la versione.


Perché è necessario?

Nel 2013, GitHub ha iniziato a utilizzare X-Content-Type-Options: nosniff , il che indica ai browser più moderni di applicare un rigoroso controllo del tipo MIME. Quindi restituisce i file non elaborati in un tipo MIME restituito dal server, impedendo al browser di utilizzare il file come previsto (se il browser rispetta le impostazioni).

Per informazioni su questo argomento, fare riferimento a questo thread di discussione .


14
Funziona anche per gli amanti. Sono stato in grado di sostituire gist.githubusercontent.comcon rawgist.come ottenuto che funziona.
Haridsv,

3
Non so chi gestisca questo sito rawgit, ma non lo uso nella produzione. Avresti una terza parte sconosciuta che può iniettare qualsiasi javascript nel tuo sito.
neves

1
@Maciej Krawczyk - sì - la pagina ti incoraggia esplicitamente a utilizzare un collegamento specifico del commit, piuttosto che un collegamento di filiale, proprio per questo motivo.
Troy Alford,

4
rawgit è ora fuori produzione (dal 08-10-2018): rawgit.com . consiglia di aggiornare questa risposta.
Chharvey,

1
Grazie per averlo segnalato @chharvey - Ho aggiornato la risposta per riflettere jsdelivr.net
Troy Alford


25

rawgithub.comreindirizza a rawgit.comQuindi l'esempio sopra sarebbe ora

http://rawgit.com/user/package/master/link.min.js


Visita rawgit.com e incolla l'URL per il file o il contenuto. Genererà un URL valido per te.
Marcelo Vani,

8
rawgit è ora fuori produzione (dal 08-10-2018): rawgit.com . consiglia di aggiornare questa risposta.
Chharvey,

10

GitHub Pages è la soluzione ufficiale di GitHub a questo problema.

raw.githubusercontentfa in modo che tutti i file utilizzino il text/plaintipo MIME, anche se il file è un file CSS o JavaScript. Quindi https://raw.githubusercontent.com/‹user›/‹repo›/‹branch›/‹filepath›non sarà il tipo MIME corretto, ma piuttosto un file di testo in chiaro e collegandolo tramite <link href="..."/>o <script src="..."></script>non funzionerà: il CSS non si applicherà / il JS non funzionerà.

GitHub Pages ospita il tuo repository in un URL speciale, quindi tutto ciò che devi fare è archiviare i tuoi file e inviare. Tieni presente che nella maggior parte dei casi, GitHub Pages richiede di impegnarti in un ramo speciale,gh-pages .

Sul tuo nuovo sito, che di solito è https://‹user›.github.io/‹repo›, tutti i file sottoposti a commit nella gh-pagesfiliale (il commit più recente) sono presenti in questo URL. Quindi puoi collegarti al tuo file js tramite <script src="https://‹user›.github.io/‹repo›/file.js"></script>, e questo sarà il tipo MIME corretto.

Hai file di build?

Personalmente, la mia raccomandazione è di eseguire questo ramo parallelamente master. Sul gh-pagesramo, è possibile modificare il .gitignorefile per il check-in tutti i file dist / build avete bisogno per il tuo sito (ad esempio se una minified / file compilati), mentre mantenendoli ignorati sul masterramo. Ciò è utile perché in genere non si desidera tenere traccia delle modifiche nei file di build nel repository normale. Ogni volta che si desidera aggiornare i file ospitati, semplicemente si fondono masterin gh-pages, ricostruire, impegnarsi, e poi spingere.

(protip: puoi unire e ricostruire nello stesso commit con questi passaggi :)

$ git checkout gh-pages
$ git merge --no-ff --no-commit master  # prepare the merge but dont commit it (as if there were a merge conflict)
$ npm run build                         # (or whatever your build process is)
$ git add .                             # stage the newly built files
$ git merge --continue                  # commit the merge
$ git push origin gh-pages

8

Le risposte di cui sopra rispondono chiaramente alla domanda, ma voglio fornire un'altra alternativa: una visione / approccio diverso per risolvere il problema simile.

Puoi anche utilizzare l'estensione del browser per rimuovere l' X-Content-Type-Optionsintestazione della risposta per i raw.githubusercontent.comfile. Esistono un paio di estensioni del browser per modificare le intestazioni di risposta.

  1. Su richiesta: Chrome + Firefox
  2. Modifica intestazioni: Firefox

Se usi Requestly, posso suggerire due soluzioni

Soluzione 1: utilizzare Modifica regola intestazioni e rimuovere l'intestazione della risposta

passi

  1. Installare su richiesta da http://www.requestly.in
  2. Vai alla pagina delle regole
  3. Fai clic su Aggiungi icona per creare una regola
  4. Seleziona Modifica intestazioni
  5. Dai un nome e Descripton
  6. Seleziona Remove-> Response->X-Content-Type-Options
  7. Nel campo Origine, inserisci Url-> Contains->raw.githubusercontent.com

Soluzione 2: utilizzare Sostituisci regola host

  1. Installare su richiesta da http://www.requestly.in
  2. Vai alla pagina delle regole
  3. Fai clic su Aggiungi icona per creare una regola
  4. Sostituisci raw.githubusercontent.comconrawgit.com

Controlla questo screenshot per maggiori dettagliinserisci qui la descrizione dell'immagine

Come testare

Abbiamo creato un semplice JS Fiddle per testare se possiamo usare file github non elaborati come script nel nostro codice. Ecco il violino con il seguente codice

<center id="msg"></center>

<script src="https://raw.githubusercontent.com/sachinjain024/practicebook/master/web-extensions-master/storage/background.js"></script>
<script>
try {
  if (typeof BG.Methods !== 'undefoned') {
    document.getElementById('msg').innerHTML = 'Script evaluated successfully!';
  }
} catch (e) {
  document.getElementById('msg').innerHTML = 'Problem evaluating script';
}
</script>

Se vedi Script evaluated successfully!, significa che sei in grado di utilizzare il file github non elaborato nel tuo codice. Altrimenti Problem evaluating scriptindica che c'è qualche problema durante l'esecuzione dello script dalla fonte github non elaborata.

Ho anche scritto un articolo sul blog di Requestly a riguardo. Si prega di fare riferimento per maggiori dettagli.

Spero che sia d'aiuto!!

Disclaimer: sono l'autore di Requestly, quindi puoi dare la colpa a tutto ciò che non ti piace.



5

Per rendere le cose chiare e brevi

//raw.githubusercontent.com -> //rawgit.com

Si noti che questo è gestito dall'hosting di sviluppo di rawgit e non dal loro cdn per l'hosting di produzione


L'URL non elaborato predefinito sembra essere cambiato da questa risposta, quindi la conversione è ora https://raw.githubusercontent.com-> https://rawgit.comAltrimenti questa risposta è più chiara e funziona.
mikeym,

4
rawgit è ora fuori produzione (dal 08-10-2018): rawgit.com . consiglia di aggiornare questa risposta.
Chharvey,

4

Il mio caso d'uso è stato quello di caricare ' bookmarklet ' direttamente dal mio account Bitbucket che ha le stesse restrizioni di Github. Il lavoro che mi è venuto in mente è stato di AJAX per lo script ed eseguito evalsulla stringa di risposta, sotto lo snippet si basa su tale approccio.

<script>
    var sScriptURL ='<script-URL-here>'; 
    var oReq = new XMLHttpRequest(); 
    oReq.addEventListener("load", 
       function fLoad() {eval(this.responseText + '\r\n//# sourceURL=' + sScriptURL)}); 
    oReq.open("GET", sScriptURL); oReq.send(); false;
</script>

Si noti che l'aggiunta di un sourceURLcommento consente di eseguire il debug dello script all'interno degli strumenti di sviluppo del browser.


1

Quando un file viene caricato su github puoi usarlo come fonte esterna o hosting gratuito. Troy Alford lo ha spiegato molto sopra. Ma per semplificarti, lascia che ti dica alcuni semplici passaggi, quindi puoi utilizzare un file raw github nel tuo sito:

Ecco il link del tuo file:

https://raw.githubusercontent.com/mindmup/bootstrap-wysiwyg/master/bootstrap-wysiwyg.js

Ora per eseguirlo devi rimuovere https: // e il punto (.) Tra raw e githubusercontent

Come questo:

rawgithubusercontent.com/mindmup/bootstrap-wysiwyg/master/bootstrap-wysiwyg.js

Ora quando visiterai questo link otterrai un link che può essere usato per chiamare il tuo javascript:

Ecco il link finale:

https://rawgit.com/mindmup/bootstrap-wysiwyg/master/bootstrap-wysiwyg.js

Allo stesso modo, se si ospita un file CSS, è necessario farlo come indicato sopra. È il modo più semplice per ottenere un semplice link per chiamare i tuoi file CSS o javascript esterni ospitati su github.

Spero che questo sia utile.

URL di riferimento: http://101helper.blogspot.com/2015/11/store-blogger-codes-on-github-boost-blogger-speed.html


3
rawgit è ora fuori produzione (dal 08-10-2018): rawgit.com . consiglia di aggiornare questa risposta.
Chharvey,

1

Ho scoperto che l'errore è stato mostrato a causa dei commenti all'inizio del file, puoi risolvere questo problema, semplicemente creando il tuo file senza commenti e spingendo a git, non mostra alcun errore

Per la prova puoi provare questi due file con lo stesso codice di semplice impaginazione:

senza commento

con commento


1

Ho avuto lo stesso problema con te, quello che ho fatto è stato cambiare

<script type="application/javascript" src="bootstrap-wysiwyg.js"></script>

Per me funziona.


cambiare da cosa a cosa? per favore, mostra il prima e il dopo
Alexander Mills l'

0

Il modo più semplice:
<script type="text/plain" src="http://raw.githubusercontent.com/user/repo/branch/file.js"></script>
servito da GitHub
e

molto

affidabile.
Con text/plain
inserisci qui la descrizione dell'immagine Senzatext/plain
inserisci qui la descrizione dell'immagine


Questa è la soluzione migliore, funziona e ha molto senso.
a20

2
no. tutto ciò non impedisce alla sceneggiatura di essere eseguita
Steven Penny il

2
Non funzionerà più presto. Dal logcat del mio dispositivo Android: "Il recupero degli script con attributi di tipo / lingua non validi è obsoleto e verrà rimosso in M56, intorno a gennaio 2017. Per ulteriori dettagli, vedere chromestatus.com/features/5760718284521472 ".
Jens Hauke,

0

raw.github.comnon è un vero accesso non elaborato alla risorsa file, ma una vista resa da Rails. Quindi l'accesso raw.github.comè molto più pesante del necessario. Non so perché raw.github.comsia implementato come vista Rails. Invece di risolvere questo problema di route, GitHub ha aggiunto X-Content-Type-Options: nosniffun'intestazione.

Soluzione:

  • Metti la sceneggiatura a user.github.io/repo
  • Utilizzare una CDN di terze parti come rawgit.com.

Per chiunque altro confuso da questo, lo hanno fatto intenzionalmente. Un tempo eri in grado di usare semplicemente raw.github.comper caricare i file - e poi Github ha capito che venivano usati come CDN, il che causava loro troppi traffico. Di conseguenza, lo hanno cambiato in questo tipo di rendering con l' X-Content-Type-Options: nosniffintestazione, in particolare per impedire alle persone di utilizzare il loro servizio in quel modo.
Troy Alford,

0

In alternativa, se generi il markup sul lato server, puoi semplicemente recuperare e iniettare. Ad esempio, in JSTL potresti fare questo:

<script type="text/javascript">
    <c:import url="https://raw.github.com/mindmup/bootstrap-wysiwyg/master/bootstrap-wysiwyg.js" />
</script>

Non consentono hotlinking per un motivo, quindi probabilmente una cattiva forma se vuoi essere un buon cittadino. Ti suggerirei di memorizzare nella cache quel javascript e di recuperarlo periodicamente solo se lo ritieni opportuno.


0

Esempio


originale

https://raw.githubusercontent.com/antelove19/qrcodejs/master/qrcode.min.js

cdn.jsdelivr.net

https://cdn.jsdelivr.net/gh/antelove19/qrcodejs/qrcode.min.js
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.