0.7.38 • Published 5 years ago

@rxdi/starter-client v0.7.38

Weekly downloads
-
License
MIT
Repository
-
Last release
5 years ago

@rxdi/starter-client-side

Starter project with PReact and Incremental DOM based on @rxdi/core

Powerful Dependency Injection inside Browser and Node using Typescript and RXJS 6


The idea behind @rxdi is to create independent, dependency injection that can be used everywhere, Node and Browser with purpose also to share the same code without chainging nothing! First steps where with platform called @gapi you can check repository @gapi/core. Then because of the needs of the platform i decided to develop this Reactive Dependency Injection container helping me build progressive applications. Hope you like my journey! Any help and suggestions are appreciated! Main repository @rxdi/core


Installation and basic examples:

To start developing, run:
git clone https://github.com/rxdi/starter-client-side
Install modules:
npm install
Running App

For starting and building application we will use Parcel a new configuration-less web bundler ParcelJS

This project is with added ReactJS and when builded for production bundle is less than 800Kb!!

To install parcel type:

npm install -g parcel-bundler
Start App
parcel ./src/index.html --target browser
Build App
parcel build ./src/index.html --target browser

Simplest app

Main starting point

src/main.ts

import { Bootstrap } from '@rxdi/core';
import { AppModule } from './app/app.module';

Bootstrap(AppModule, {
    init: false,
    initOptions: {
        services: true,
    },
    logger: {
        logging: true,
        date: true,
        hashes: true,
        exitHandler: true,
        fileService: true
    }
})
.subscribe(
    () => console.log('Started!'),
    (e) => console.error(e)
);

App Module

src/app/app.module.ts

import { Module } from "@rxdi/core";
import { CoreModule } from './core/core.module';
import { AppComponent } from "./app.component";

@Module({
    imports: [CoreModule],
    bootstrap: [AppComponent]
})
export class AppModule {}

App Component

src/app/app.component.tsx

import { Component, Injector } from "@rxdi/core";
import { Subscription } from "rxjs";
import { h, render, Component as PreactComponent } from 'preact';
import { AppService } from "./core/services/app.service";
import { HelloProps, HelloState } from "./app.model";

@Component()
export class AppComponent extends PreactComponent<HelloProps, HelloState> {

    @Injector(AppService) private appService: AppService;

    private subscription: Subscription;

    OnBefore() {
        render(<AppComponent compiler="TypeScript" framework="React" rxdi="@rxdi" />, document.body);
    }

    render() {
        return <div>
            <h1>Hello from {this.props.compiler}, {this.props.framework} and {this.props.rxdi}!</h1>
            <h1>Reactive Service Counter: {this.state && this.state.value}</h1>
        </div>;
    }

    componentDidMount() {
        this.subscription = this.appService.state.subscribe(state => this.setState(state));
    }

    componentWillUnmount() {
        this.appService.clearInterval();
        this.subscription.unsubscribe();
    }

}

App State

export class HelloProps {
    compiler: string;
    framework: string;
    rxdi: string;
}

export class HelloState {
    value: number;
}

App Service

import { Service } from "@rxdi/core";
import { BehaviorSubject } from "rxjs";
import { HelloState } from "../../app.model";

@Service()
export class AppService {
    count: number = 0;
    state: BehaviorSubject<HelloState> = new BehaviorSubject({ value: 0 });
    interval: any;

    constructor() {
        this.interval = setInterval(() => {

            this.count++
            // Stop changing state when count reaches 6
            if (this.count <= 6) {
                this.state.next({ value: this.count });
            }

            console.log(this);
            // Until count is 15 no DOM manipulations will be triggered
            // Start changing state when count reaches 15
            if (this.count > 10) {
                this.state.next({ value: this.count });
            }
        }, 1000);
    }

    clearInterval() {
        clearInterval(this.interval);
    }

}

Renderer service

Renderer example is not related with example above, just different use case for @rxdi/core.

It can be used for creating low level library where you can build your own Incremental DOM

More information can be found here: IDOM

src/app/core/services/renderer.ts

import { Service } from "@rxdi/core";

export class NodeData {
    text: string;
    name: string;
    constructor(name) {
        this.name = name;
        this.text = null;
    }
}

@Service()
export class RendererService {
    constructor(

    ) {
        console.log("My awesome app!");
        const NODE_DATA_KEY = '__ID_Data__';

        // The current nodes being processed
        let currentNode = null;
        let currentParent = null;

        function getData(node) {
            if (!node[NODE_DATA_KEY]) {
                node[NODE_DATA_KEY] = new NodeData(node.nodeName.toLowerCase());
            }

            return node[NODE_DATA_KEY];
        }

        function enterNode() {
            currentParent = currentNode;
            currentNode = null;
        }

        function nextNode() {
            currentNode = currentNode ? currentNode.nextSibling : currentParent.firstChild;
        }

        function exitNode() {
            currentNode = currentParent;
            currentParent = currentParent.parentNode;
        }

        const matches = function (matchNode, name/*, key */) {
            const data = getData(matchNode);
            return name === data.name // && key === data.key;
        };

        function renderDOM(name) {
            if (currentNode && matches(currentNode, name/*, key */)) {
                return currentNode;
            }

            const node = name === '#text' ?
                document.createTextNode('') :
                document.createElement(name);

            currentParent.insertBefore(node, currentNode);

            currentNode = node;

            return node;
        }

        function elementOpen(name) {
            nextNode();
            const node = renderDOM(name);
            enterNode();

            // check for updates, i.t attributes
            const data = getData(node);
            return currentParent;
        }

        function elementClose(node) {
            exitNode();

            return currentNode;
        }

        function text(value) {
            nextNode();
            const node = renderDOM('#text');

            // checks for text updates
            const data = getData(node);

            if (data.text !== value) {
                data.text = (value);
                node.data = value;
            }

            return currentNode;
        }


        function patch(node, fn, data) {
            currentNode = node;

            enterNode();
            fn(data);
            exitNode();
        };


        function render(data) {
            elementOpen('h1');
            {
                text('Hello, ' + data.user)
            }
            elementClose('h1');
            elementOpen('ul')
            {
                elementOpen('li');
                {
                    text('Counter: ')
                    elementOpen('span');
                    {
                        text(data.counter);
                    }
                    elementClose('span');
                }
                elementClose('li');
            }

            elementClose('ul');
        }

        const element = document.getElementById('renderer');

        document.querySelector('button').addEventListener('click', () => {
            data.counter++;
            patch(element, render, data);
        });
        document.querySelector('input').addEventListener('input', (e) => {
            data.user = e.target['value'];
            console.log(data);

            patch(element, render, data);
        });

        const data = {
            user: 'Alexey',
            counter: 1
        };

        patch(element, render, data);
    }
}

Notes

@Injector() - Decorator also can be used which will depend imediately instance of Class can be used as follow

@Component()
export class AppComponent extends PreactComponent<any, any> {
    @Injector(AppService) private appService: AppService;
}

InjectSoft - Function is added due to problem when extending React.Component or Preact Component class.

Dependencies are not resolved and extended correctly by React.Component class.This is temporary solution for injecting Services when constructor is intialized and setting properties to correct constructor.

Except @Component() when extending React.Component all other decorators work as expected depending inside constructor.

When using NodeJS reamains unchanged

Later releases will be created separated class extending react and will be inside othe repository @rxdi/reactive-components Can be extended as follow

import { Component } from "@rxdi/core";
import { ReactComponent } from "@rxdi/reactive-components";
import { ReactiveService } from "../components/react.service";

@Component()
export class AppComponent extends ReactComponent<any, any> {

    // private reactiveService: ReactiveService = InjectSoft(ReactiveService); older version

    constructor(
        private reactiveService: ReactiveService
    ) {
        super();
    }

}
0.7.38

5 years ago

0.7.37

5 years ago

0.7.36

5 years ago

0.7.35

5 years ago

0.7.34

5 years ago

0.7.33

5 years ago

0.7.32

5 years ago

0.7.31

5 years ago

0.7.30

5 years ago

0.7.29

5 years ago

0.7.28

5 years ago

0.7.27

5 years ago

0.7.26

5 years ago

0.7.25

5 years ago

0.7.24

5 years ago

0.7.23

5 years ago

0.7.22

5 years ago

0.7.21

5 years ago

0.7.20

5 years ago

0.7.19

5 years ago

0.7.18

5 years ago

0.7.17

5 years ago

0.7.16

5 years ago

0.7.15

5 years ago

0.7.14

5 years ago

0.7.13

5 years ago

0.7.12

5 years ago

0.7.11

5 years ago

0.7.10

5 years ago

0.7.9

5 years ago

0.7.8

5 years ago

0.7.7

5 years ago

0.7.6

5 years ago

0.7.5

5 years ago

0.7.4

5 years ago

0.7.3

5 years ago

0.7.2

5 years ago

0.7.1

5 years ago

0.7.0

5 years ago

0.6.13

5 years ago

0.6.12

5 years ago

0.6.11

5 years ago

0.6.10

5 years ago

0.6.9

5 years ago

0.6.8

5 years ago

0.6.7

5 years ago

0.6.6

5 years ago

0.6.5

5 years ago

0.6.4

5 years ago

0.6.3

5 years ago

0.6.2

5 years ago

0.6.1

5 years ago

0.6.0

5 years ago

0.5.21

5 years ago

0.5.20

5 years ago

0.5.19

5 years ago

0.5.18

5 years ago

0.5.17

5 years ago

0.5.16

5 years ago

0.5.15

5 years ago

0.5.14

5 years ago

0.5.13

5 years ago

0.5.12

5 years ago

0.5.11

5 years ago

0.5.10

5 years ago

0.5.9

5 years ago

0.5.8

5 years ago

0.5.7

5 years ago

0.5.6

5 years ago

0.5.5

5 years ago

0.5.4

5 years ago

0.5.3

5 years ago

0.5.2

5 years ago

0.5.1

5 years ago

0.5.0

5 years ago

0.4.35

5 years ago

0.4.34

5 years ago

0.4.33

5 years ago

0.4.32

5 years ago

0.4.31

5 years ago

0.4.30

5 years ago

0.4.29

5 years ago

0.4.28

5 years ago

0.4.27

5 years ago

0.4.26

5 years ago

0.4.25

5 years ago

0.4.24

5 years ago

0.4.23

5 years ago

0.4.22

5 years ago

0.4.21

5 years ago

0.4.20

5 years ago

0.4.19

5 years ago

0.4.18

5 years ago

0.4.17

5 years ago

0.4.16

5 years ago

0.4.15

5 years ago

0.4.14

5 years ago

0.4.13

5 years ago

0.4.12

5 years ago

0.4.11

5 years ago

0.4.10

5 years ago

0.4.9

5 years ago

0.4.8

5 years ago

0.4.7

5 years ago

0.4.6

5 years ago

0.4.5

5 years ago

0.4.4

5 years ago

0.4.3

5 years ago

0.4.2

5 years ago

0.4.1

5 years ago

0.4.0

5 years ago

0.3.19

5 years ago

0.3.18

5 years ago

0.3.17

5 years ago

0.3.16

5 years ago

0.3.15

5 years ago

0.3.14

5 years ago

0.3.13

5 years ago

0.3.12

5 years ago

0.3.11

5 years ago

0.3.10

5 years ago

0.3.9

5 years ago

0.3.8

5 years ago

0.3.7

5 years ago

0.3.6

5 years ago

0.3.5

5 years ago

0.3.3

5 years ago

0.3.2

5 years ago

0.3.1

5 years ago

0.3.0

5 years ago

0.2.36

5 years ago

0.2.35

5 years ago

0.2.34

5 years ago

0.2.33

5 years ago

0.2.32

5 years ago

0.2.31

5 years ago

0.2.30

5 years ago

0.2.29

5 years ago

0.2.28

5 years ago

0.2.27

5 years ago

0.2.26

5 years ago

0.2.25

5 years ago

0.2.24

5 years ago

0.2.23

5 years ago

0.2.22

5 years ago

0.2.21

5 years ago

0.2.20

5 years ago

0.2.19

5 years ago

0.2.18

5 years ago

0.2.17

5 years ago

0.2.16

5 years ago

0.2.15

5 years ago

0.2.14

5 years ago

0.2.13

5 years ago

0.2.12

5 years ago

0.2.11

5 years ago

0.2.10

5 years ago

0.2.9

5 years ago

0.2.8

5 years ago

0.2.7

5 years ago

0.2.6

5 years ago

0.2.5

5 years ago

0.2.4

5 years ago

0.2.3

5 years ago

0.2.2

5 years ago

0.2.1

5 years ago

0.2.0

5 years ago

0.1.1

5 years ago

0.1.0

5 years ago

0.0.424

5 years ago

0.0.423

5 years ago

0.0.422

5 years ago

0.0.421

5 years ago

0.0.420

5 years ago

0.0.419

5 years ago

0.0.418

5 years ago

0.0.417

5 years ago

0.0.416

5 years ago

0.0.415

5 years ago

0.0.414

5 years ago

0.0.413

5 years ago

0.0.412

5 years ago

0.0.411

5 years ago

0.0.410

5 years ago

0.0.409

5 years ago

0.0.408

5 years ago

0.0.407

5 years ago

0.0.406

5 years ago

0.0.405

5 years ago

0.0.404

5 years ago

0.0.403

5 years ago

0.0.402

5 years ago

0.0.401

5 years ago

0.0.400

5 years ago

0.0.399

5 years ago

0.0.398

5 years ago

0.0.397

5 years ago

0.0.396

5 years ago

0.0.395

5 years ago

0.0.394

5 years ago

0.0.393

5 years ago

0.0.392

5 years ago

0.0.391

5 years ago

0.0.390

5 years ago

0.0.389

5 years ago

0.0.388

5 years ago

0.0.387

5 years ago

0.0.386

5 years ago

0.0.385

5 years ago

0.0.384

5 years ago

0.0.383

5 years ago

0.0.382

5 years ago

0.0.381

5 years ago

0.0.380

5 years ago

0.0.379

5 years ago

0.0.378

5 years ago

0.0.377

5 years ago

0.0.376

5 years ago

0.0.375

5 years ago

0.0.374

5 years ago

0.0.373

5 years ago

0.0.372

5 years ago

0.0.371

5 years ago

0.0.370

5 years ago

0.0.369

5 years ago

0.0.368

5 years ago

0.0.367

5 years ago

0.0.366

5 years ago

0.0.365

5 years ago

0.0.364

5 years ago

0.0.363

5 years ago

0.0.362

5 years ago

0.0.361

5 years ago

0.0.360

5 years ago

0.0.359

5 years ago

0.0.358

5 years ago

0.0.357

5 years ago

0.0.356

5 years ago

0.0.355

5 years ago

0.0.354

5 years ago

0.0.353

5 years ago

0.0.352

5 years ago

0.0.351

5 years ago

0.0.350

5 years ago

0.0.349

5 years ago

0.0.348

5 years ago

0.0.347

5 years ago

0.0.346

5 years ago

0.0.345

5 years ago

0.0.344

5 years ago

0.0.343

5 years ago

0.0.342

5 years ago

0.0.341

6 years ago

0.0.340

6 years ago

0.0.339

6 years ago

0.0.338

6 years ago

0.0.337

6 years ago

0.0.336

6 years ago

0.0.335

6 years ago

0.0.334

6 years ago

0.0.333

6 years ago

0.0.332

6 years ago

0.0.331

6 years ago

0.0.330

6 years ago

0.0.329

6 years ago

0.0.328

6 years ago

0.0.327

6 years ago

0.0.326

6 years ago

0.0.325

6 years ago

0.0.324

6 years ago

0.0.323

6 years ago

0.0.322

6 years ago

0.0.321

6 years ago

0.0.320

6 years ago

0.0.319

6 years ago

0.0.318

6 years ago

0.0.317

6 years ago

0.0.316

6 years ago

0.0.315

6 years ago

0.0.314

6 years ago

0.0.313

6 years ago

0.0.312

6 years ago

0.0.311

6 years ago

0.0.310

6 years ago

0.0.309

6 years ago

0.0.308

6 years ago

0.0.307

6 years ago

0.0.306

6 years ago

0.0.300

6 years ago

0.0.299

6 years ago

0.0.298

6 years ago

0.0.297

6 years ago

0.0.296

6 years ago

0.0.295

6 years ago

0.0.294

6 years ago

0.0.293

6 years ago

0.0.292

6 years ago

0.0.291

6 years ago

0.0.290

6 years ago

0.0.289

6 years ago

0.0.288

6 years ago

0.0.287

6 years ago

0.0.286

6 years ago

0.0.285

6 years ago

0.0.284

6 years ago

0.0.283

6 years ago

0.0.282

6 years ago

0.0.281

6 years ago

0.0.280

6 years ago

0.0.279

6 years ago

0.0.278

6 years ago

0.0.277

6 years ago

0.0.276

6 years ago

0.0.275

6 years ago

0.0.274

6 years ago

0.0.273

6 years ago

0.0.272

6 years ago

0.0.271

6 years ago

0.0.270

6 years ago

0.0.269

6 years ago

0.0.268

6 years ago

0.0.267

6 years ago

0.0.266

6 years ago

0.0.265

6 years ago

0.0.263

6 years ago

0.0.261

6 years ago

0.0.260

6 years ago

0.0.259

6 years ago

0.0.258

6 years ago

0.0.257

6 years ago

0.0.256

6 years ago

0.0.255

6 years ago

0.0.254

6 years ago

0.0.253

6 years ago

0.0.252

6 years ago

0.0.251

6 years ago

0.0.250

6 years ago

0.0.249

6 years ago

0.0.248

6 years ago

0.0.247

6 years ago

0.0.246

6 years ago

0.0.245

6 years ago

0.0.244

6 years ago

0.0.243

6 years ago

0.0.242

6 years ago

0.0.241

6 years ago

0.0.240

6 years ago

0.0.239

6 years ago

0.0.238

6 years ago

0.0.237

6 years ago

0.0.236

6 years ago

0.0.235

6 years ago

0.0.234

6 years ago

0.0.233

6 years ago

0.0.232

6 years ago

0.0.231

6 years ago

0.0.230

6 years ago

0.0.229

6 years ago

0.0.228

6 years ago

0.0.227

6 years ago

0.0.226

6 years ago

0.0.225

6 years ago

0.0.224

6 years ago

0.0.223

6 years ago

0.0.222

6 years ago

0.0.221

6 years ago

0.0.220

6 years ago

0.0.219

6 years ago

0.0.218

6 years ago

0.0.217

6 years ago

0.0.216

6 years ago

0.0.215

6 years ago

0.0.214

6 years ago

0.0.213

6 years ago

0.0.212

6 years ago

0.0.211

6 years ago

0.0.210

6 years ago

0.0.209

6 years ago

0.0.208

6 years ago

0.0.207

6 years ago

0.0.206

6 years ago

0.0.205

6 years ago

0.0.204

6 years ago

0.0.203

6 years ago

0.0.202

6 years ago

0.0.201

6 years ago

0.0.200

6 years ago

0.0.199

6 years ago

0.0.198

6 years ago

0.0.197

6 years ago

0.0.196

6 years ago

0.0.195

6 years ago

0.0.194

6 years ago

0.0.193

6 years ago

0.0.192

6 years ago

0.0.191

6 years ago

0.0.190

6 years ago

0.0.189

6 years ago

0.0.188

6 years ago

0.0.187

6 years ago

0.0.186

6 years ago

0.0.185

6 years ago

0.0.184

6 years ago

0.0.183

6 years ago

0.0.182

6 years ago

0.0.181

6 years ago

0.0.180

6 years ago

0.0.179

6 years ago

0.0.178

6 years ago

0.0.177

6 years ago

0.0.176

6 years ago

0.0.175

6 years ago

0.0.174

6 years ago

0.0.173

6 years ago

0.0.172

6 years ago

0.0.171

6 years ago

0.0.170

6 years ago

0.0.169

6 years ago

0.0.168

6 years ago

0.0.167

6 years ago

0.0.166

6 years ago

0.0.165

6 years ago

0.0.164

6 years ago

0.0.163

6 years ago

0.0.162

6 years ago

0.0.161

6 years ago

0.0.160

6 years ago

0.0.159

6 years ago

0.0.158

6 years ago

0.0.157

6 years ago

0.0.156

6 years ago

0.0.155

6 years ago

0.0.154

6 years ago

0.0.153

6 years ago

0.0.152

6 years ago

0.0.151

6 years ago

0.0.150

6 years ago