LWC

VisualforceでLWCを動かすLightning Outの手順

Visualforceの画面にLWCの部品だけ差し込みたいときに使うのがLightning Outです。LWCを外へ公開する空のAuraアプリが要る理由と、実装3点セットの書き方を説明します。

2023.04.05

なぜVisualforceの中でLWCを使うのか

移行しきれていない画面がVisualforceに残っていても、部品単位ならLWCを差し込めます。Lightning Outという仕組みを使うと、VisualforceページのdivタグにLWCを描画できます。画面をまるごとLightning化しなくても、新しく作る部品だけLWCで書けます。

全体の構成

LWCを直接Visualforceページから呼び出すことはできません。LWCを外へ公開するための、薄いAuraアプリが1つ要ります。これはSalesforce公式のLightning Outの仕様で、いまも変わっていません。

ファイル役割
Auraアプリ(ltng:outAppを継承)LWCを外へ公開するための入れ物。中身は空でよい
LWC本体実際にVisualforceページへ表示する部品
Visualforceページapex:includeLightningでライブラリを読み込み、$Lightning.use()と$Lightning.createComponent()でLWCを描画する
Visualforceページの中にAura、その中にLightning Webコンポーネントが入れ子になった図
3つの入れ子の関係です。いちばん外がVisualforceページ、その中にAuraアプリ、いちばん内側にLWCが入ります。
ここで作るAuraアプリに業務ロジックは書きません。<aura:application access="GLOBAL" extends="ltng:outApp"></aura:application>だけの空のアプリです。Aura自体を使う設計ではなく、Lightning OutがLWCをVisualforceへ渡すために決めている入り口です。

Auraアプリ

エディタのファイル一覧。LWCContainerSampleフォルダにappとapp-meta.xmlの2ファイル
Auraアプリはこの2ファイルだけです。appが本体、app-meta.xmlがメタデータです。

LWCContainerSample.app

<aura:application access="GLOBAL" extends="ltng:outApp">
</aura:application>

中身は空です。LWCを外部へ公開するための入れ物として、ltng:outAppを継承するだけです。

LWCContainerSample.app-meta.xml

<?xml version="1.0" encoding="UTF-8"?>
<AuraDefinitionBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>67.0</apiVersion>
    <description>A Lightning Application Bundle</description>
</AuraDefinitionBundle>

apiVersionを56.0から67.0(Summer '26)へ上げています。

LWC本体

エディタのファイル一覧。lightningOutComponentSampleにhtml、js、js-meta.xmlの3ファイル
LWCは3ファイルで1組です。htmlが見た目、jsが動き、js-meta.xmlが設定を持ちます。

lightningOutComponentSample.html

<template>
    <div class="slds-box">
        <p>Lightning Web Component Sample</p>
    </div>
</template>

SLDSのボックスにテキストを表示するだけの最小構成です。

lightningOutComponentSample.js

import { LightningElement } from 'lwc';
export default class LightningOutComponentSample extends LightningElement {}

プロパティもロジックも持たない最小のコンポーネントです。

lightningOutComponentSample.js-meta.xml

<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>67.0</apiVersion>
    <isExposed>false</isExposed>
</LightningComponentBundle>

apiVersionを67.0へ上げています。isExposedはfalseのままでよく、Lightning Outからの呼び出しに公開設定は要りません。

Visualforceページ

エディタのファイル一覧。LightningOutSample.pageとpage-meta.xmlの2ファイル
Visualforceページ側もpageとmeta.xmlの2ファイルです。ここに描画の入り口を書きます。

LightningOutSample.page

<apex:page standardStylesheets="false" sidebar="false" applyBodyTag="false" docType="html-5.0">
    <apex:includeLightning />
    <div id="lwc-container-Sample"></div>
    <script>
        $Lightning.use("c:LWCContainerSample", function () {
            $Lightning.createComponent(
                "c:lightningOutComponentSample",
                {},
                "lwc-container-Sample",
                function (component) {
                    console.log("component: " + component);
                }
            );
        });
    </script>
</apex:page>

apex:includeLightningでライブラリを読み込み、$Lightning.use()でAuraアプリを、$Lightning.createComponent()でLWCを描画します。読み取りだけの表示サンプルです。

⚠️ $Lightning.use()に渡す名前はAuraアプリの名前(c:LWCContainerSample)です。$Lightning.createComponent()に渡す名前がLWCの名前(c:lightningOutComponentSample)になります。ここが最初のつまずき所です。

LightningOutSample.page-meta.xml

<?xml version="1.0" encoding="UTF-8"?>
<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>67.0</apiVersion>
    <label>LightningOutSample</label>
</ApexPage>

apiVersionを67.0へ上げています。

動かすときの条件

Lightning Outはいまも公式ドキュメント上でベータ扱いです。Salesforceのベータサービスに関する利用規約が適用されるので、本番の主要な動線に使う前提なら、その点を織り込んで検討してください。

サードパーティCookieを許可していないブラウザでは、コンポーネントが表示されません。Lightningコンポーネントは、Visualforceページと別のドメインから配信されるためです。Auraアプリ・LWC・Visualforceページは、同じ組織の中に置く必要があります。

タブに配置して確認する

  1. Visualforceページ用のタブを作る

    設定のタブから、LightningOutSampleページを開くタブを新規作成します。

  2. 作ったタブを開く

    アプリケーションのナビゲーションに追加するか、URLで直接開きます。

  3. LWCの表示を確認する

    divタグの中に「Lightning Web Component Sample」の文字が表示されていれば成功です。表示されないときは、ブラウザの開発者ツールでコンソールのエラーを確認します。

Visualforceタブの詳細画面。タブ名とコンテンツにLightningOutSampleが入っている
作ったタブの詳細です。コンテンツ欄に対象のVisualforceページが入っているかを見てください。
タブを開いた画面。ページの中にLWCのテキストが1行表示されている
タブを開いた状態です。赤枠の1行がdivタグの中に描画されたLWCで、ここが出れば成功です。

ここで間違えやすい

間違い何が起きるか
Auraアプリを作らずLWCだけ呼ぼうとする$Lightning.use()に渡す名前が無く、そもそも組み立てられません
$Lightning.use()にLWCの名前を渡す実際に渡すのはAuraアプリの名前です。LWCの名前はcreateComponent()側に書きます
サードパーティCookieをブロックしたブラウザで確認するコンポーネントの描画が失敗します。原因がわかりにくいエラーになります
古いapiVersionのまま放置する新しいAPIの機能が使えないままになります

確認した環境

  • 2026年9月 / Salesforce Summer '26(API バージョン 67.0)時点の公式ドキュメントで、VisualforceへのLWC埋め込みの構成(Auraアプリが要ること)、Lightning Outのベータ扱い、サードパーティCookieの条件を確認しています
  • コードは API バージョン 67.0 で書いています

まとめ

  • VisualforceページにLWCを表示するには、いまもLightning Outを使います。LWCを直接呼び出す方法はありません
  • LWCを外へ公開するための、空のAuraアプリが1つ要ります。ここに業務ロジックは書きません
  • Visualforceページ側はapex:includeLightning・$Lightning.use()・$Lightning.createComponent()の3点で組み立てます
  • Lightning Outはいまも公式にベータ扱いです。サードパーティCookieを許可していないと表示されません
  • apiVersionは56.0から67.0(Summer '26)へ上げています

Salesforceの導入・運用についてご相談ください

導入前の検討から、お使いの環境の改修・運用、AIとの連携まで承ります。状況を伺ったうえで、進め方をご提案します。