Vue.js and Webpack 4 From Scratch, Part 1

Part 1: Up and running

My previous article described how to create a Vue.js application using the command line interface. This is the easiest way to get started and will be suitable for the majority of needs. However, it certainly doesn’t hurt to try taking the opposite road and build an application entirely from scratch. With the release of Webpack 4 now is a good time to take this ambitious route and learn a bit more about the workings of the build and bundling process by crafting it entirely by hand.

In this article I will start with an empty folder and create a webpack build for a Vue.js application including:

Hot Module loading with webpack-dev-server

Linting using eslint

CSS pre-processing with stylus

Testing using @vue/test-utils and Jest

The only pre-requisite is having node and npm installed, although I will be using VSCode as my editor.

The final code for this article is available on github for reference, the official webpack templates will undoubtedly be updated to Webpack 4 shortly.

As this is quite a long process I will divide the article into parts, this first part will take us from an empty folder up to a simple page containing a Vue component bundled with webpack and opened in a browser window.

Part 2 will cover hot module reloading, styling and transpilation using babel.

The final part covers linting, testing, static assets and CSS extraction.

The first thing to do is create a new folder, cd into it and initialise NPM:

npm init

You will be asked to provide some information about the project, it’s safe to accept defaults at this stage, and once completed you will have a package.json file entirely empty of anything other than meta-information. Now we can begin adding our packages.

npm install --save vue vue-router

This installs our application dependencies.

npm install --save-dev webpack webpack-cli

This installs webpack to allow us to begin building our application bundle.

Application Structure

I like to put all the application code, our javascript and vue components, in a subfolder called src. In here I will add:

app.js : The application entrypoint.

App.vue: The root component

pages: A folder containing all top-level components, each of these will have a route entry associated with it.

components: A folder containing our building block components. Components will be organised into sub-folders based on feature.

router: A folder for all our vue-router configuration.

If I was using vuex I would create another folder called store to contain all our actions/mutations etc.

When I create these, the folder structure should look like this:

We’ll start our app.js with possibly the simplest entrypoint possible:

import Vue from 'vue'

import App from './App.vue'

new Vue({

el: '#app',

render: h => h(App)

})

This will pull in our App component and render it into the DOM element with id “app”. Our App component is just as simple for the moment:

Hello World!

Now we have some Vue code, we need to bundle it using Webpack so it can be pulled into our html.

Webpack

Webpack is a module bundler for Javascript applications, when we run the webpack command we are asking it to start at our entrypoint and then build a dependency graph of the whole application, pulling those dependencies into one or more bundles that can be included in our application. It supports multiple different file types through loaders, loaders will take files that have no concept of modules (e.g. css) and process them in a way that allows them to participate in the overall dependency graph that webpack is building.

Webpack 4 was just released with a ton of new features including:

Built-in chunking support with the optimization API.

Support for 5 different module types, including Web Assembly modules.

A “mode” configuration setting that applies a sensible set of defaults, simple projects can be built relying on this alone to determine how to build your application.

Zero-config setups (#0CJS). If you supply the mode then Webpack will use default entry and output settings to build your application without the need for a config file.

All this plus smaller bundle sizes and faster build times!

Let’s try out a simple webpack build.

In the root of our project create a folder called build and add a file called webpack.config.dev.js. We will use this to configure a loader for our Vue single-file components.

'use strict'

const { VueLoaderPlugin } = require('vue-loader')

module.exports = {

mode: 'development',

entry: [

'./src/app.js'

],

module: {

rules: [

{

test: /\.vue$/,

use: 'vue-loader'

}

]

},

plugins: [

new VueLoaderPlugin()

]

}

The module section will contain all our loaders, each loader declaration consists of a minimum of 2 properties, test and loader. Test is a regular expression that webpack will use to identify which file types to be processed by this loader and loader is the name of the loader itself.

For this to work we need to install some more dependencies:

npm install --save-dev vue-loader vue-template-compiler vue-style-loader css-loader

And add an npm build script:

"build": "webpack --config build/webpack.config.dev.js"

We also need to add an index.html file to pull in our built bundle, place this in the root of the project:

My Vue app with webpack 4

If you now run the build script you should see something like this:

And if you open index.html in your browser you should see:

As an aside, there is an extension for VSCode, “Live Server”, that allows you to right-click on html files and launch them in an on-demand web server as opposed to opening them from your file system. Eventually we will serve our application using webpack-dev-server with hot module reloading but for the meantime this is an excellent stopgap.

Next Step

In the next part of the article I will create a component with some script to illustrate babel-compilation and configure stylus for our css. We will install webpack-dev-server and configure hot module reloading including support for static assets. To complete the application we will create a production build including splitting out of vendor modules and show how to test our application using @vue/test-utils and jest.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容