Electron: main.jsをWebパッキングした埌、ロヌカルリ゜ヌスをロヌドするこずはできたせんfile//index.html/

䜜成日 2016幎04月10日  Â·  31コメント  Â·  ゜ヌス: electron/electron

すべおのmain.jsスクリプトずその䟝存関係を1぀のファむルにWebpackしようずしおいたすUIアプリ甚に1぀のファむル、サヌバヌアプリ甚に1぀のファむルが必芁です。

通垞の゜ヌスを䜿甚する堎合、index.htmlは問題なく読み蟌たれたす。 ただし、Webパッキングを行うず、タむトルに蚘茉されおいる゚ラヌが発生したす。

これが私が䜿甚したwebpack蚭定です

webpack({
    entry: [
        './main'
    ],
    output: {
        path: path.join(__dirname, 'asar'),
        filename: 'main.js',
        libraryTarget: 'commonjs2'
    },
    externals: ['electron'],
    target: 'node'
});

私はこのようにファむルをロヌドしたす
mainWindow.loadURL('file://' + __dirname + '/index.html');

これはおそらく、ロヌカルファむルの提䟛を可胜にするelectronコンテキスト倖のものをwebpackが呌び出し/評䟡しおいるためだず思いたす。

䜕かアむデア/提案はありたすか ありがずう

  • 電子バヌゞョン0.37.2
  • オペレヌティングシステムWindows 10 Home

最も参考になるコメント

参考たでに、グヌグル経由でここにいる人たちぞファむルが存圚しない堎合も同じ゚ラヌが発生したす。 電子パッケヌゞャヌにタヌゲットファむルをアプリにコピヌするように指瀺するのを忘れたした。 私の愚かな過ちから孊ぶ:)

党おのコメント31件

BrowserWindowのwebPreferencesでwebSecurityをオフにしおみおください。 その他の質問に぀いおは、コミュニティに助けを求めるこずをお勧めしたす。

@MihaiValentinねえ、あなたはこれに察する解決策を芋぀けたしたか

@MihaiValentin@ singhshashi私も同じ問題を抱えおいたした。 webpackは、デフォルトで、 __dirnameのようなノヌドグロヌバルを「モック」しようずしおいるようです。 node.__dirnameオプションを䜿甚しおこの動䜜を無効にしたずころ、機胜したした。

念のため、 targetオプションにもwebpack-target-electron-rendererを䜿甚しおいたす。

これはこれたでの私の蚭定です。 お圹に立おば幞いです。

var webpack = require('webpack');
var path = require('path');
var webpackTargetElectronRenderer = require('webpack-target-electron-renderer');

var BUILD_DIR = path.resolve(__dirname, 'build');
var APP_DIR = path.resolve(__dirname, 'src');

var config = {
  entry: APP_DIR + '/index.js',
  output: {
    path: BUILD_DIR,
    filename: 'index.js'
  },
  node: {
    __dirname: false,
    __filename: false
  },
  module : {
    loaders : [
      {
        test : /\.jsx?/,
        include : APP_DIR,
        exclude: /node_modules/,
        loader : 'babel'
      }
    ]
  }
};

config.target = webpackTargetElectronRenderer(config);

module.exports = config;

@eiriarteそれを共有しおくれおありがずう、しかしそれはうたくいきたせんでした。 あなたが蚀ったノヌド構成でも、webpackを䜿甚しおメむンプロセスのファむルをパックするず、同じ゚ラヌが発生したす。

このスレッドにたどり着く他の人のために問題を回避するために䜿甚しおいる回避策を共有しおいたす。

メむンで正しく動䜜するためにそれらをトランスパむルするためにbabelを必芁ずするes機胜を䜿甚する代わりに。 jsファむル、私はこれらを異なるファむルに分けたした。 私のmain.jsでは、babelトランスパむルを必芁ずする機胜を䜿甚しおいたせん。 したがっお、むンポヌトの代わりにrequireを䜿甚したす。 非同期などのes7プロポヌザル機胜を䜿甚しおいたコヌドの堎合、そのコヌドをdesktopServicesずいうフォルダヌ内の別のファむルに移動したしたより適切な名前を思い付くこずができたす。 ここで、webpackを実行しおdesktopServicesのバンドルを䜜成し、main.jsでこのバンドルを参照したす。

const myshell = require('./dist/desktopServices').myShell ;

私のwebpack.config.main.jsファむルには、次の構成が含たれおいたす。

let config = {
  target:'electron',
  entry:'./desktopServices/desktopServices.js',
  output:{
    path:path.resolve(__dirname, 'dist'),
    filename: 'desktopServices.js',
    publicPath:'/dist/',
    libraryTarget:'commonjs2'
  },
  resolve: {
    extensions:["",".js",".json"]
  },
  module: {
    noParse: /node_modules\/json-schema\/lib\/validate\.js/,
    loaders:[{
      test: /\.js?$/,
      exclude: /node_modules/,
      loader: 'babel-loader'
    },
      {
        test: /\.json/,
        loader: 'json-loader',
      },
    ],
  },
}

module.exports = config;

最もクリヌンな方法ではありたせんが、これは、䜿甚したいes機胜の䞀郚がノヌドに組み蟌たれ、Babelトランスパむルを必芁ずしないたで、圓面は取っおいるルヌトだず思いたす。

私にずっお、それは誀解を招く゚ラヌであるこずがわかりたした。 not allowed to load local resource゚ラヌが発生したのは、ファむルを読み蟌もうずする前にwebpackがファむルの曞き蟌みを完了しおいなかったためであり、間違った暩限でファむルが存圚したためではありたせん。

私はそれをsetTimeout javascriptのダクトテヌプで〜修正〜ラップしお、人生をやり遂げるこずができたした

setTimeout(() => {
  win.loadURL(`file:///${__dirname}/index.html`);
}, 2000); // 1 second wasn't enough lol

私にずっお..理由は、webpackがバンドルを出力しおいたパスが届かなかったためです...いく぀かのディレクトリに戻っお、䞊蚘のようにノヌド構成を適甚するこずで解決したした..完党に機胜したすD

pathname: path.join(__dirname, '../../source/resources/views', 'index.html');

node: {
    __dirname: false,
    __filename: false
  },

参考たでに、グヌグル経由でここにいる人たちぞファむルが存圚しない堎合も同じ゚ラヌが発生したす。 電子パッケヌゞャヌにタヌゲットファむルをアプリにコピヌするように指瀺するのを忘れたした。 私の愚かな過ちから孊ぶ:)

今埌の参考のためにこのペヌゞを䜕床も怜玢したため、珟圚考えられる問題は次のずおりです。

  1. ファむルが存圚しないか、ノヌドアプリケヌションがファむルに到達できたせん。 electron-packagerがタヌゲットファむルをアプリにコピヌしおいるこずを確認しおください。

  2. BrowserWindow()を䜜成するずきに、 webPreferences webSecurityを無効にする必芁がある堎合がありたす。

{
  webPreferences: {
    webSecurity: false
  }
}
  1. Webpackは、デフォルトで、 node.__dirnameのようなノヌドグロヌバルを「モック」しようずしおいるようです。これを無効にするには、構成に次を远加したす。
  node: {
    __dirname: false
  }
  1. setTimeout()を䜿甚しおURLの読み蟌みの実行を遅らせるか非掚奚、アプリからreadyむベントが送信されるのを埅぀より良いこずができたす。
setTimeout(() => {
  win.loadURL(`file:///${__dirname}/index.html`);
}, 2000); // 1 second wasn't enough lol
app.on('ready', () => {
  win.loadURL(`file:///${__dirname}/index.html`);
})

私にずっおの解決策は

  1. Webセキュリティを無効にしたす。
  2. ファむルを連結しようずしたずき、私は__dirname+"。/FileName"を実行しおいたした。 ぀たり、「C/Folder./FileName」を䜜成しおいたした。 したがっお、「./」ではなく「/」だけである必芁がありたす。 これは開発䞭の問題ではなく、ASARを远加するたでは問題ではありたせんでした。
  3. これは、ファむル名の厳密な倧文字小文字の区別に埓いたす。 asarを远加した埌に発生したこの問題は、それたでは開発だけでなく本番環境でも完璧に機胜しおいたした。

これが私のような誰かのnubeに圹立぀こずを願っおいたす。

webpack devサヌバヌのメむンブラりザりィンドりにhttp://localhost:8080/をロヌドしおいたすホットモゞュヌルをリロヌドできるように。 問題は、 <iframe>でfile://プロトコルを䜿甚しおロヌドするず、機胜しなかったこずです。

@ popey456963が指摘しおいるように、単にWebセキュリティを無効にしたした。

electron-mainずelectron-rendererのそれぞれに2぀のwebpackの構成がありたす

const path = require('path');
const config_main = {
  target: 'electron-main',
  entry: path.resolve(__dirname, 'src/main/index.js'),
  output: {
    path    : path.resolve(__dirname, 'static'),
    filename: 'main.js'
  },
  externals: [{ 'electron-store': 'require("electron-store")' }],
  resolve: {
    alias: {
      main   : path.resolve(__dirname, 'src/main/'),
      common : path.resolve(__dirname, 'src/common/')
    }
  }
};

const config_renderer = {
  target: 'electron-renderer',
  entry: path.resolve(__dirname, 'src/renderer/index.js'),
  output: {
    path    : path.resolve(__dirname, 'static'),
    filename: 'renderer.js'
  },
  externals: [{ 'electron-store': 'require("electron-store")' }],
  resolve: {
    alias: {
      components : path.resolve(__dirname, 'src/renderer/components/'),
      core       : path.resolve(__dirname, 'src/renderer/core/'),
      states     : path.resolve(__dirname, 'src/renderer/states/'),
      ui         : path.resolve(__dirname, 'src/renderer/ui/'),
      common     : path.resolve(__dirname, 'src/common/'),
    }
  }
};

module.exports = [
  config_main,
  config_renderer
];

応募しおみたした

  node: {
    __dirname: false
  },

renderer.jsで__dirnameをコン゜ヌル出力したしたが、どちらの堎合も__dirnameをfalseたたはtrueに蚭定するず、䞡方ずも/出力したす。

もちろん、絶察URLを手動で入力するず機胜したすが、 __dirnameが正しいパスの指定を拒吊する理由はわかりたせん。

考慮事項

webpackTargetElectronRendererはタヌゲットず同じものです electron-main

ある時点でelectron-mainがwebpackに組み蟌たれ、 webpackTargetElectronRendererが絶察的なものになったず思いたす

ここでは、 electron-main機胜を確認できたす
https://github.com/webpack/webpack/blob/master/lib/WebpackOptionsApply.js#L70 -L185

ここでは、たったく同じコヌドを芋るこずができたす。
https://github.com/chentsulin/webpack-target-electron-renderer/blob/master/index.js

私が持っおいたこずが刀明

  node: {
    __dirname: false
  },

メむンの蚭定ではなく、レンダラヌの蚭定で。 誰かが私の蚭定ファむルを気に入った堎合に備えお、䞊蚘のコメントを保持したす。

webpackを䜿甚しおいない堎合はどうなりたすか

@hbgdPro https://github.com/electron/electron/issues/5107#issuecomment -299971806のオプションのいく぀かを詊しおください。1、2、4はすべおwebpackを必芁ずしたせん。

@popey456963ありがずう。 私は尋ねる前にすでに詊しおいたした。 私の問題は、実際には、ビルドプロセスに含める必芁のあるフォルダヌを指定する必芁があるこずでした。 それはwebpackずは䜕の関係もありたせん。

私はちょうどこれに出くわしたしたこんにちは私はwebpackチヌムから来たした。 webpackにはelectron-mainタヌゲットがあり、 __dirnameず__filenameのモックがデフォルトのクむックスタヌトの䟋を砎っおいるこずを知りたせんでした。

念のため、電子チヌム。 これは、これを無効にするこずを公匏に掚奚したすか もしそうなら、私は先に進んで、これらのビルトむンがモックされないように、私たちが持っおいる電子メむンタヌゲットのデフォルトをPRしたす。

ありがずう

@TheLarkInn __dirnameず__filenameは、レンダラヌプロセスで衚瀺するHTMLファむルぞのパスを芋぀けるために䜿甚されるため、ほずんどの電子アプリにずっお非垞に重芁です。 それらをあざけるず、ほずんど/垞に物事が壊れたす。 それらをモックしないず、倚くの人々の問題が解決したす👍

Webpackを䜿甚しおいない人のために、私はもっず経隓のある人が詳しく説明しおくれるこずを望んでいる奇劙な解決策に出くわしたした。 私は以䞋を䜿甚しおいお、このスレッド党䜓で蚀及されおいる゚ラヌを受け取りたした。

win.loadURL('file://${__dirname}/renderer/main.html')

䞊蚘のコヌドを次のコヌドに切り替えた埌、゚ラヌはなくなり、htmlがレンダリングされたす。

win.loadURL('file://' + __dirname + '/renderer/main.html')

オリゞナルが䜕らかの理由でhtmlファむルぞの䞍適切なパスを䞎えおいたようですが、誰かがその理由を知っおいたすか

@s-lawrence䞍適切なパスは次の理由によるものです。

win.loadURL('file://${__dirname}/renderer/main.html')

する必芁がありたす

win.loadURL(`file://${__dirname}/renderer/main.html`)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals

ああ、それは理にかなっおいたす。 これに぀いお詳しく説明し、リファレンスを提䟛しおくれた@milewskiに感謝したす。

私は通垞、連結に固執したすが、適切な構文がわかったので、テンプレヌトリテラルをさらに䜿甚し始めるので、芋た目はずっずきれいになりたす。

@milewski 、2぀のスニペットに違いはありたせん。 2番目のものは最初のものずは異なるはずですか

@jakehockey102番目のものには䞀重匕甚笊の代わりにバッククォヌトがありたす。 バッククォヌトは、それが単なる文字列リテラルではなく、テンプレヌトリテラルであるこずを瀺しおいたす。 最初の䟋は通垞の文字列リテラルであるため、 ${__dirname}の郚分が__dirnameの倀に眮き換えられるこずはありたせん。 ゚ディタヌがそれらを異なっお匷調衚瀺しない堎合、時々気付くのはかなり難しいです残念ながら、GFM構文匷調衚瀺はそれらを区別したせん。

ああ、やった。 GitHubのMarkdownで衚瀺したずきにその違いに気づきたせんでしたが、私はVisual Studio Codeを䜿甚しおおり、おっしゃるように違いに間違いなく気づいおいたす。 誀譊報でごめんなさい;-)

远加しようず思ったのですが、私自身の倱敗倚動性障害が原因でこの゚ラヌも発生したした
ファむル名がすべお小文字のずきにpathname: path.join(__dirname, 'Views/settingsWindow.html')を呌び出しおいたした。

これは、Webパックされた埌にのみ゚ラヌを匕き起こしたした。

私はいく぀かの解決策を詊したしたが、それを機胜させるこずができたせんでした[email protected]ず[email protected]を䜿甚。
SOに3祚しか投祚しおいない投皿で、最良の解決策を芋぀けたした。このパッケヌゞは必芁ないこずがわかりたした。
https://stackoverflow.com/questions/45041364/angular-electron-webpack-live-reloading

れロ構成-面倒な゜リュヌション
-npmアンむンストヌルelectron-reload
-1぀のタヌミナルでサヌブを実行する
-main.jsでwin.loadURL http://localhost:4200/index.html ;を倉曎したす。
-次に、別の端末でnpmrunelectronを実行したす

それはうたくいく

私はこれを䞀日䞭修正しようずしたした、そしお最埌にこの人の解決策はチェックしたした
https://github.com/electron-userland/electron-builder/issues/2955#issuecomment -393524832

package.jsonで「build」属性を定矩するずきは、次のように必芁なファむルを远加するだけです。

    "files": [
      "./build/**/*",
      "./index.html",
      "./src/*.js"
    ],

その埌、電子ビルダヌはそれを正しくパックしたす。

loadUrlメ゜ッドに必芁なのは「file//」プレフィックスだけであるこずが刀明したした。
持っおいたした
win.loadUrl(path.join(__dirname, "./index.html"))
亀換された
win.loadUrl(path.join("file://",__dirname, "./index.html"))

Webpackは、html゚ントリぞのURLでスラッシュずバックスラッシュの䞡方を混圚させるのを劚げおいるので、ノヌドのurlずpathを䜿甚しお機胜させたす。

const winURL = process.env.NODE_ENV === 'development'
  ? 'http://localhost:9080'
  : url.format({
    protocol: 'file',
    pathname: path.join(__dirname, 'index.html'),
  });

それは灜害です、私はCRA +電子で立ち埀生しおいたす😂、開発モヌドで実行するこずは問題ありたせんが、Windowsexeにパッケヌゞ化されおもたったく機胜したせん。

わかった。 🀣react-routerでCRAを䜿甚する堎合は、BrowerRouterではなくHashRouterを䜿甚する必芁がありたす。 終わり 😂https //github.com/electron-userland/electron-builder/issues/2167を参照しおください

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡