Electron 使用 Webpack2 打包多入口应用程序

接前面一篇文章,前一篇文章中只有一个页面,并且只有一个js文件,所以打包的时候会把那个js打包成一个bundle.js文件。但是假如我们有多个页面,且每个页面需要使用的js文件也不同,那么我们应该怎样打包呢。

安装依赖库

这里准备做个小的演示程序,首先安装一些这个演示程序需要看的第三方库

$ npm install --save-dev electron
$ npm install --save-dev electron-packager
$ npm install --save-dev webpack
$ npm install --save-dev webpack-dev-server

$ npm install --save-dev webpack-target-electron-renderer
$ npm install --save-dev is-electron-renderer
$ npm install --save-dev css-loader
$ npm install --save-dev style-loader
$ npm install --save-dev extract-text-webpack-plugin

* 注:这里使用的webpack是2.5.1版本 *

工程结构

这个演示程序包含的文件结构如下所示:

myapp
|-- main.js
|-- package.json
|-- src
|   |-- home.html
|   |-- home.js
|   |-- about.html
|   |-- about.js
|   |-- contact.html
|   |-- contact.js
|   |-- user.js
|   `-- style.css
`-- webpack.config.js
  • main.js - 程序的入口
  • package.json - 是node的包说明文件
  • webpack.config.js - webpack配置文件
  • src/home.html和home.js - 主页面
  • src/about.html和about.js- 关于页面
  • src/contact.html和contact.js- 联系我们页面
  • src/user.js - 一个自定义的js模块
  • src/style.css - 演示用的css文件

文件说明

package.json

{
  "name": "myapp",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "electron": "webpack && electron .",
    "packager": "webpack && electron-packager . --platform=linux --electron-version=1.6.6  --overwrite"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "css-loader": "^0.28.1",
    "electron": "^1.6.7",
    "electron-packager": "^8.7.0",
    "extract-text-webpack-plugin": "^2.1.0",
    "is-electron-renderer": "^2.0.1",
    "style-loader": "^0.17.0",
    "webpack": "^2.5.1",
    "webpack-dev-server": "^2.4.5",
    "webpack-target-electron-renderer": "^0.4.0"
  }
}
  • 其中 main 定义了 app 的入口
  • scripts 中的 electron 定义了一个命令用来使用 webpack 打包并使用 electron 来运行应用程序
  • scripts 中的 packager 定义了打包程序为一个可执行程序。

webpack.config.js

/* eslint strict: 0 */
'use strict';

const path = require('path');
const webpack = require('webpack');

module.exports ={
  target: 'electron-renderer',
  entry: {
      home: "./src/home.js",
      about: "./src/about.js",
      contact: "./src/contact.js"
  },
  output: {
    path: path.join(__dirname, 'build'),
    publicPath: path.join(__dirname, 'src'),
    filename: '[name].bundle.js',
  },
  module: {
    rules: [{
      test: /\.css$/,
      use: [ 'style-loader', 'css-loader' ]
    }]
  }
};
  • 其中 target 指定为 electron-renderer
  • 定义了多个entry - home, about 和 contact
  • output 中 filename 定义成 ‘[name].bundle.js’,其中 [name] 即是上面 entry 中定义的名字。

main.js

Electron App 的入口 js 文件,启动一个窗口并加载 src/index.html 文件。

/* eslint strict: 0 */
'use strict';

const electron = require('electron');
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;
let mainWindow = null;

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit();
});

app.on('ready', () => {
  mainWindow = new BrowserWindow({ width: 1024, height: 768 });

  mainWindow.loadURL(`file://${__dirname}/src/home.html`);

  mainWindow.webContents.openDevTools();

  mainWindow.on('closed', () => {
    mainWindow = null;
  });
})

Home Page

home.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Home</title>
  </head>
  <body>
    <script src="../build/home.bundle.js"></script>
    <h1>This is home!</h1>
    <ul>
      <li><a href="./contact.html">Contact us</a></li>
      <li><a href="./about.html">About</a></li>
    </ul>
  </body>
</html>

注:其中引用的js变成了 home.bundle.js

home.js

import './style.css';

console.log('This is home!');

var User = require('./user');

var user1 = new User('kongxx');
console.log("Hi, I am " + user1.getName());

var user2 = new User('ken');
console.log("Hi, I am " + user2.getName());

console.log('running in electron: ', require('is-electron-renderer'));

About Page

about.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>About</title>
  </head>
  <body>
    <script src="../build/about.bundle.js"></script>
    <h1>This is about!</h1>
    <a href="./home.html">Back</a>
  </body>
</html>

注:其中引用的js是 about.bundle.js

about.js

import './style.css';
console.log('This is about!');

Contact us Page

contact.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Contact</title>
  </head>
  <body>
    <script src="../build/contact.bundle.js"></script>
    <h1>This is contact!</h1>
    <a href="./home.html">Back</a>
  </body>
</html>

注:其中引用的js是 contact.bundle.js

contact.js

import './style.css';
console.log('This is contact!');

src/user.js

一个自定义的模块文件

module.exports = User;

function User(name) {
  this.name = name;
}

User.prototype.getName = function() {
  return this.name;
}

src/style.css

一个自定义的 css 文件

body {
  background: grey;
  font-size: 20px;
}

测试

  • 运行 electron 应用程序

    $ npm run electron
    
    > myapp@1.0.0 electron /home/jhadmin/workspace/nodejs/myapp
    > webpack && electron .
    
    Hash: 1ebbb1014b2da9075658
    Version: webpack 2.5.1
    Time: 500ms
                Asset     Size  Chunks             Chunk Names
       home.bundle.js  19.8 kB       0  [emitted]  home
    contact.bundle.js    19 kB       1  [emitted]  contact
      about.bundle.js    19 kB       2  [emitted]  about
       [0] ./src/style.css 996 bytes {0} {1} {2} [built]
       [1] ./~/css-loader!./src/style.css 215 bytes {0} {1} {2} [built]
       [2] ./~/css-loader/lib/css-base.js 2.26 kB {0} {1} {2} [built]
       [3] ./~/style-loader/addStyles.js 9.15 kB {0} {1} {2} [built]
       [4] ./~/style-loader/fixUrls.js 3.01 kB {0} {1} {2} [built]
       [5] ./~/is-electron-renderer/index.js 304 bytes {0} [built]
       [6] ./src/user.js 127 bytes {0} [built]
       [7] ./src/about.js 55 bytes {2} [built]
       [8] ./src/contact.js 57 bytes {1} [built]
       [9] ./src/home.js 320 bytes {0} [built]

    这一步会首先运行 “webpack” 来生成 home.bundle.js,about.bundle.js 和 contact.bundle.js 文件,然后再使用 “electron .” 来运行应用程序。

    访问不同的页面观察日志输出可以发现每个页面均使用了各自的 bundle.js 文件。

  • 打包 electron 应用程序

    $ npm run packager

    上面程序执行后,会在当前目录下生成 myapp-linux-x64 目录,然后运行 myapp-linux-x64/myapp 即可启动打包好的可执行程序。


转载请以链接形式标明本文地址

本文地址:http://blog.csdn.net/kongxx/article/details/72356566

Electron 使用 Webpack2 打包多入口应用程序的更多相关文章

  1. Electron 使用 Webpack2 打包应用程序

    Electron 使用 Webpack2 打包应用程序 前两天看了一下使用 Electron 来开发应用程序,今天说说所怎样集成 Electron 和 Webpack2 来打包应用程序. 安装依赖库 ...

  2. Electron 使用 Webpack2 预编译 Electron 和 Browser targets

    Electron 使用 Webpack2 预编译 Electron 和 Browser targets 前一篇文章说了说怎样使用 Webpack2 预编译 Electron 应用,但是有时候我们希望使 ...

  3. Electron桌面应用打包流程

    一. 准备工作 1.npm的安装需要下载node.js,安装完node.js之后npm自然会有. 参考链接:http://www.runoob.com/nodejs/nodejs-install-se ...

  4. Electron把网页打包成桌面应用并进行源码加密

    前言 最近想把自己用html+css+js做的网页界面打包成桌面应用,网上一搜,发现Electron是一个不错的选择,试了试,发现效果真的不错.这里记录一下打包过程以作记录,便于自己以后查看学习. 一 ...

  5. electron安装+运行+打包成桌面应用+打包成安装文件+开机自启动

    1.初始化node项目,生成package.json文件 npm init 2.安装electron,并保存为开发依赖项 npm install electron -D 3.根目录下新建index.j ...

  6. 使用IzPack打包JAVA Web应用程序

    使用IzPack打包JAVA Web应用程序步骤如下: 这里使用IzPack-4.3.5 + launch4j-3.1.0-beta1-win32.zip(绿色版)对Web应用程序打包,打包后即可对我 ...

  7. Unity3D 程序打包报错(程序是连接数据库进行处理的)

    打包这个Unity3D的程序时出现错误(程序是由XML数据改成连接数据库): ArgumentException: The Assembly System.Configuration is refer ...

  8. 打包.NET Core的程序到一个单独的可执行文件

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:打包.NET Core的程序到一个单独的可执行文件.

  9. Oracle oledb 打包并集成到程序安装包(VC ADO訪问Oracle)

    近期有一个项目和oracle交互,我用的是ADO的方式进行试问操作. 首先把数据库连接的东东记录一下,老了记性不好啊! 操作例如以下: //连接串这么写的话就能够不用配置 tnsnames.ora配置 ...

随机推荐

  1. Excel常见操作,重复数据,去除数据关联

    Eecel对一个数据进行操作后按住右下角的十字架往下拉就可以对下面的操作进行相同 的操作,所以只需先对一个数据进行操作,再拉下来就可以了 通过公式处理的数据跟其它数据有关联 需要对这些数据进行去除它们 ...

  2. 解释一下python中的身份运算符

    通过身份运算符‘is’和‘is not’,我们可以确定两个值是否相同 ')#False print(True is not False)#True

  3. Django学习笔记之Django视图View

    一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. ...

  4. ASP.NET MVC 在项目中使用面包屑导航

    给框架添加一个面包屑导航 1.创建一个类 using System; using System.Collections.Generic; using System.Linq; using System ...

  5. tesseract编译各种 “锟斤拷” 等中文乱码 编译失败问题

    编译tesseract - ocr时 各种不通过 也很疑惑,完全按照官方指导来的啊 首先以为是vs的编码问题,随切换选项-切换Unicode或多编码字符集,但仍无效. 定位到乱码的文件,用notepa ...

  6. log4j日志的配置--Debug

    ############################### 日志记录器定义 ################################ 日志输出级别 OFF.DEBUG.INFO.WARN. ...

  7. [UOJ210]寻找罪犯

    2-sat神题.. 告诉是2-sat我也完全想不到正解. 看了看题解其实一步步分析也不算很难 这个题首先是要围绕每个人是否是犯人和每句话是否是真话来思考 首先要明确的是: 1.好人不说谎话 2.说了谎 ...

  8. MySQL数据库中tinyint类型字段读取数据为true和false (MySQL的boolean和tinyint(1))

    数据库一个表中有一个tinyint类型的字段,值为0或者1,如果取出来的话,0会变成false,1会变成true. MySQL保存boolean值时用1代表TRUE,0代表FALSE.boolean在 ...

  9. LVS+Keepalived+Tomcat实现高可用性及均衡负载

    1.Keepalived简介 Keepalived是Linux下一个轻量级别的高可用解决方案.Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考 ...

  10. python+senium+chrome的简单爬虫脚本

    简述: 开始接触python写web自动化的脚本主要源于在公司订阅会议室,主要是使用python+selenium+chromedriver驱动chrome浏览器来完成的,其中部分python代码可以 ...