Dışarıdan web paketli kodu çağırma (HTML komut dosyası etiketi)


130

Diyelim ki böyle bir sınıfım var (typcript ile yazılmış) ve onu webpack ile paketlediğim bundle.js.

export class EntryPoint {
    static run() {
        ...
    }
}

İndex.html dosyama paketi ekleyeceğim, ancak daha sonra bu statik yöntemi de çağırmak istiyorum.

<script src="build/bundle.js"></script>
<script>
    window.onload = function() {
        EntryPoint.run();
    }
</script>

Ancak, EntryPointbu durumda tanımsızdır. O halde paketlenmiş javascript'i başka bir komut dosyasından nasıl çağırırım?

Eklendi : Webpack yapılandırma dosyası .


Lütfen web paketi yapılandırmanızı ekleyin. Yönteminizde , çizgisi boyunca bir şeyin var EntryPoint = require('EntryPoint')eksik olduğuna inanıyorum onload.
Martin Vseticka

2
@MartinVseticka Yapılandırmamı ekledim. Aslında, buna benzer bir şey requiregerekli olabilir, ancak aşağıdaki ithal ile aynı, diyor require is not defined. Yapmaya çalıştığım şey, düz javascript'ten paketlenmiş içeriği kullanmak, kullanmak için tekrar bir çerçeveye ihtiyacım olmaz requiremı? Ama bundan kaçınmaya çalışıyorum. Umarım mantıklıdır.
Raven

Yanıtlar:


147

Görünüşe göre web paketi paketini bir kitaplık olarak göstermek istiyorsunuz . Web paketini, kitaplığınızı kendi değişkeniniz dahilinde küresel bağlamda gösterecek şekilde yapılandırabilirsiniz.EntryPoint .

TypeScript'i bilmiyorum, bu yüzden örnek bunun yerine düz JavaScript kullanıyor. Ancak buradaki önemli parça web paketi yapılandırma dosyası ve özellikle şu outputbölümdür:

webpack.config.js

module.exports = {
  entry: './index.js',
  output: {
    path: './lib',
    filename: 'yourlib.js',
    libraryTarget: 'var',
    library: 'EntryPoint'
  }
};

index.js

module.exports = {
  run: function () {
    console.log('run from library');
  }
};

Ardından, beklediğiniz gibi kitaplık yöntemlerinize erişebileceksiniz:

<script src="lib/yourlib.js"></script>
<script>
  window.onload = function () {
    EntryPoint.run();
  };
</script>

Asıl kod ile özü kontrol edin .


20
Birden fazla giriş noktamız var, bu yüzden çıktı bölümünde bunun yerine yaptım library: ["GlobalAccess", "[name]"],. Bu, daha sonra var'ı her bir giriş noktası için üyelere sahip bir nesne haline getirir: GlobalAccess.EntryPointFoo, GlobalAccess.EntryPointBar, vb.
John Hatton

3
Bu işe yarar, nam run buildancak dev ortam kullanılarak çalışmaz webpack-dev-server. Dışa aktarılan EntryPoint'im boş bir nesnedir. Herhangi bir fikir?
nkint

1
Peki o zaman giriş: {page1: ['module1.js', 'module2.js'], page2: 'module3.js'} @JohnHatton önerisinin işe yaramadığı durumda. Page1.module2'ye erişiyorum, ancak page1.module1'e erişemiyorum. Görünüşe göre sonuncusunu alıyor.
sheamus

1
takip edilen adımlar, konfigürasyon değiştirildi, yeniden oluşturuldu, ancak hala yakalanmıyor ReferenceError: EntryPoint tanımlı değil
user889030

2
Ben index.js değiştirerek babel + webpack v3.10.0 iş benzer bir örnek ele verdik export function run() {}danmodule.exports = ...
dworvos

55

Bu çalışmayı herhangi bir webpack.config.jsdeğişiklik yapmadan , sadece importmain / index.js dosyamdan çağırdığım ifadeyi kullanarak başardım :

import EntryPoint from './EntryPoint.js';
window.EntryPoint = EntryPoint;

görüntü açıklamasını buraya girin

Referans için, işte benim weback.config.js dosyam.

Başlangıçta aynı şeyi kullanarak requireyapmayı denedim , ancak modül sarmalayıcıyı window.EntryPointgerçek sınıfın aksine atadı .


3
Bunu es6 olmadan yapma şansı var mı? Aksi takdirde anlarım Uncaught SyntaxError: Unexpected token import. Yoksa sizin index.jsde paketlenmiş mi (Giriş noktası olarak görüyorum ama emin değilim)?
Raven

Evet, index.js de paketlenmiş - işte burada import ifadesini
Mat

3
Gördüğünüz gibi, pakete ait olmayan bir komut dosyasından paketlenmiş bir şeye erişmeye çalışıyorum. Paket bir kitaplıktı ve yöntemlerine dışarıdan erişmeye çalışırdım. Mümkün mü?
Raven

4
Bu çözüm gerçekten çok basit ve sorun ortaya çıkar çıkmaz bunu düşünmediğim için kendimden utanıyorum.
cav_dan

1
Saatlerdir bu soruna takılıp kaldım. Senaryoyu paketime taşıyacaktım ama bu bir sürü soruna neden olurdu. Basit cevap için teşekkürler !!
Stephen Agwu

14

Benim durumumda, paketlenmiş JavaScript içinden başka bir komut dosyasından bir işlevi, işlevi oluştururken pencereye yazarak çağırabildim.

// In the bundled script:
function foo() {
    var modal = document.createElement('div');
}
// Bind to the window
window.foo = foo;
// Then, in the other script where I want to reference the bundled function I just call it as a normal function
<button onClick="window.foo()">Click Me</button>

Babel'i kullanamadım, bu yüzden bu benim için çalıştı.


Bu çok güzel bir çözüm.
Teoman shipahi

1

Benzer bir zorluk yaşadım, bir yolculuktaki birden çok sayfa için bir paket oluşturmak istedim ve her sayfanın koda kendi giriş noktası olmasını ve her sayfa için ayrı bir paket olmadan olmasını istedim.

İşte benim yaklaşımım Kurt Williams'a çok benziyor, ancak biraz farklı bir açıdan, ayrıca web paketi yapılandırmasını değiştirmeden:

JourneyMaster.js

import { getViewData } from './modules/common';
import { VIEW_DATA_API_URL } from './modules/constants';
import { createLandingPage, createAnotherPage } from './modules/components/pageBuilder';

window.landingPageInit = () => {
    getViewData(VIEW_DATA_API_URL).then(viewData => {
        createLandingPage(viewData);
    });
};

window.anotherPageInit = () => {
    getViewData(VIEW_DATA_API_URL).then(viewData => {
        createAnotherPage(viewData);
    });
};

// I appreciate the above could be one liners,
// but readable at a glance is important to me

Sonra htmlsayfanın sonunda bu yöntemleri nasıl adlandırdığıma dair bir örnek :

<script src="/js/JourneyMaster.js"></script>
<script>window.landingPageInit();</script>

0

WEBPACK.CONFIG.JS

1. UMD KULLANIMI

module.exports={
            mode:'development',
            entry:'./yourentry.js',
            output:{
            path:path.resolve(__dirname,"dist"),
            filename:'main.js',
            publicPath:'/dist/',
            libraryTarget:'umd', 
            library:'rstate',
            umdNamedDefine: true,
            libraryExport: 'default' 
        }
    }

index.html

<script src="dist/main.js"></script>
<script>
  window.onload = function () {
  rstate()=>{}
</script>

main.js

export default function rstate(){
console.log("i called from html")
}

2. VAR KULLANIMI

module.exports={
            mode:'development',
            entry:'./yourentry.js',
            output:{
            path:path.resolve(__dirname,"dist"),
            filename:'main.js',
            publicPath:'/dist/',
            libraryTarget:'var', 
            library: 'EntryPoint'
        }
    }

index.html

<script>
  window.onload = function () {
  EntryPoint.rstate()=>{}
</script>

main.js

module.exports={
rstate=function(){
console.log("hi module")
}
}

3. AMD'yi beğendiğimiz kütüphane olarak kullanmak (lib yapmak isteyenler için)

define(['jquery', './aux-lib.js'], function ($) { ..(1).. });

-4

App.ts:

namespace mytypescript.Pages {

        export class Manage {

     public Initialise() {
     $("#btnNewActivity").click(() => {
                    alert("sdc'");
                });
        }
    }
}

sayfam.html:

 <input class="button" type="button" id="btnNewActivity" value="Register New Activity" />

 <script type="text/javascript">
    var page = new mytypescript.Pages.Manage();
    page.Initialise();
</script>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.