For some web developers, JavaScript’s ecosystem can be fatigue. Especially this year where there is a lot of tooling and configuring is required. So, to make your work easier, we submit a list of 3 generic libraries/frameworks for front-end development.
Vue.js
If you haven’t put any attention on Vue.js before, now you have to keep your eyes on. It is a tiny JavaScript framework which seems to primarily focus on views and give you only a handful of tools to regulate data for those views. Moreover, Vue.js is also good for a change as it doesn’t get stuffed with programming design pattern and limitations.
There are two types of Vue.js. A stand-alone version that includes the template compiler and the runtime version that doesn’t. You can see its simplicity, through an example of a component that shows a message and brings interactivity to a button to reverse the message.
<div id="app">
<p>{{ message }}</p>
<button v-on:click="reverseMessage">Reverse Message</button>
</div>
import Vue from 'vue'
new Vue({
el: '#app',
data: {
message: 'Hello World!',
},
methods: {
reverseMessage: function () {
const reversedMessage = this.message
.split('')
.reverse()
.join('');
this.message = reversedMessage;
},
},
});
Don’t you worry about the existence of other plugins, as you still can find them on Vue.js. In fact, several guides are available to use there. This framework will be suitable for you, especially if you wish to have productive fast. It also scales well as the project grows.
Svelte
Svelte must be the latest JavaScript Libraries as it has been released in mid-November 2016. At some point, it may looks similar to Vue.js, but leaves a smaller footprint. “Traditional” frameworks need runtime code to define and execute modules; keeps state, update the views and do whatever frameworks do. Moreover, with Svelte you can dissolve into clean JavaScript code as of you didn’t use a framework at all. The big advantages that you can get is that its file size.
Svelte has plugins so you can compile the source code using Webpack, Browserify, Rollup or Gulp.
You can use the below example of creating the Vue.js example with Svelte as a comparison:
<p>{{ message }}</p>
<button on:click="reverseMessage()">Reverse Message</button>
<script>
export default {
data () {
return {
message: 'Hello World!',
}
},
methods: {
reverseMessage () {
const reversedMessage = this.get('message')
.split('')
.reverse()
.join('');
this.set({
message: reversedMessage,
});
}
}
};
</script>
The very same module created with Vue.js produces a 7kb bundle. Svelte produces a 2kb file.
In terms of performance, Svelte competes with Inferno. This makes Svelte becomes a good choice if you care about your application’s footprint. At the time of writing, Svelte either doesn’t have its plugin system documented, or doesn’t have one at all. The TODO indicates that Svelte will support plugins and might have an API to hook into the framework.
The compatibility of the compiled code depends on your build workflow stack, so it’s hard to say what its default compatibility is. Technically you should be able to achieve pre-ES% support by including ES5 shims.
To conditionally load and invoke modules, Conditioner.js is one of the good choices. The difference from other module loaders is that conditioner.js allows you define conditions under which to load and/or show a module. This results in reducing loading time and saving bandwidth.
However, you better already have functional components in place that are enhanced with a given JavaScript module. How those modules are defined is entirely up to you. You could even make it load modules from your favorite framework.
To get started, you can install it via npm: npm install conditioner-js.
The demo is unlike previous ones to better illustrate Conditioner.js’ features. Imagine we wish to show the time remaining to an event. A module is shown like this:
import moment from 'moment';
export default class RelativeTime {
/**
* Enhance given element to show relative time.
* @param {HTMLElement} element - The element to enhance.
*/
constructor(element) {
this.startTime = moment(element.datetime);
// Update every second
setInterval(() => this.update(), 1000);
this.update();
}
/**
* Update displayed relative time.
*/
update() {
element.innerHTML = this.startDate.toNow();
}
}
It is so simple to initialize the module:
<time datetime="2017-01-01" data-module="ui/RelativeTime">2017</time>
Conditioner will then load the ui/RelativeTime module at this location in the DOM. Note the content is already present and in an acceptable format and the module only enhances that.
If you want a module to initialize only when it’s visible to a user, you can do so with conditions:
<!-- Show RelativeTime only if it is visible to the user -->
<time datetime="2017-01-01" data-module="ui/RelativeTime" data-conditions="element:{visible}">2017</time>
<!-- Keep showing RelativeTime after it was visible to the user -->
<time datetime="2017-01-01" data-module="ui/RelativeTime" data-conditions="element:{was visible}">2017</time>
Conditioner.js has quite an extensive list of monitors, which you use to define conditions. Don’t fret! You only have to include those you need, preventing the inclusion of unnecessary code.
You can also pass along options as a JSON string or a slightly more readable JSON variant.
<!-- JSON variant -->
<div data-module="ui/RelativeTime" data-options='unit:"seconds"'>...</div>
<!-- Or good old JSON -->
<div data-module="ui/RelativeTime" data-options='{"unit":"seconds"}'>...</div>