搜索

首页  >  问答  >  正文

javascript - Electron使用Anguar编写渲染线程的问题

各位好:

我想在electron的渲染线程中使用angular框架,但是不想把代码使用webpack打包,因为electron的渲染线程中也同样支持commonJS语法,所以我想只把Typescript转化为commonJS不打包,然后直接在index.html中require相应的文件。下面是我的实现过程

首先我创建了3个ts文件

  1. app.component.ts

    1

    2

    3

    4

    5

    6

    <code class="typescript">import { Component } from '@angular/core'

    @Component({

      selector: 'my-app' ,

      template: '<input type="text" [(ngModel)]="name" /><h1>Hello {{name}}</h1>'

    })

    export class AppComponent { name = 'Aungtcs' }</code>

  2. app.module.ts

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    <code class="typescript">import { NgModule } from '@angular/core'

    import { FormsModule } from '@angular/forms'

    import { BrowserModule } from '@angular/platform-browser'

    import { AppComponent } from './app.component'

    @NgModule ({

      imports: [

        FormsModule ,

        BrowserModule

      ] ,

      declarations: [

        AppComponent

      ] ,

      bootstrap: [

        AppComponent

      ] ,

      exports: [

        AppComponent

      ]

    })

    export class AppModel {  }</code>

  3. main.ts

    1

    2

    3

    4

    5

    <code class="typescript">import 'core-js/es7'

    import 'zone.js'

    import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'

    import { AppModel } from './app/app.module'

    platformBrowserDynamic().bootstrapModule(AppModel)</code>

然后使用tsc编译这三个文件

1

<code class="shell">tsc ./main.ts ./app/app.component.ts ./app/app.module.ts</code>

现在生成了对应的js文件,目录结构如下:

接着在index.htmlrequire('./main')

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<code class="html"><!DOCTYPE html>

<html lang="en">

<head>

  <meta charset="UTF-8">

  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <meta http-equiv="X-UA-Compatible" content="ie=edge">

  <title>Document</title>

</head>

<body>

  <my-app>ok...</my-app>

</body>

<script type="text/javascript">

  require('./main')

</script>

</html></code>

启动electron程序

到目前为止程序看起来都是正常的,也符合我的目的,但是当我更改输入框里面的内容的时候,问题出现了,下面h1标签里面的{{name}}表达式并不随着输入框里面的值变化,就是说数据绑定没有效果。

接下来...

接下来为了探索问题原因,我把之前tsc生成的3个js文件使用webpack进行了打包

1

<code class="shell">webpack ./main.js main.out.js</code>

index.html中的require语句换成require('./main.out'),再次运行程序

现在再修改input里面的内容,数据绑定生效了!!!

有谁知道原因么?知道的话请告诉我,万分感谢!!!

某草草某草草2839 天前882

全部回复(2)我来回复

  • 欧阳克

    欧阳克2017-06-14 10:55:29

    把main.ts里的import 'zone.js'改成import 'zone.js/dist/zone.js'
    原因的话,你看看zone.js的package.json应该就清楚了

    回复
    0
  • 阿神

    阿神2017-06-14 10:55:29

    我对electron不太熟, 但你的问题我觉得应该是在import的问题。

    首先webpack的工作原理就是把所有的js打包起来,比如你引用node_modules里面的@angular/core, 那webpack知道会去node_modules里面去找到他并打包到指定的文件夹里面去(比如你的app文件夹里面),所以使用webpack后引用是正常的。 那问题就在这里了, electron对于非./开头的路径会去node_modules找到它吗?

    回复
    0
  • 取消回复