In the previous post, we’ve briefly walked through how to build Vue.js application on ASP.NET Core. Like other modern JavaScript framework, VueJs also supports TypeScript out-of-the-box. If we can get full benefits from TypeScript to build a VueJs app, it would be awesome! There are many resources referring to the combination of VueJs and TypeScript. However, they are not using the basic template that VueJs provides, which brings about less confidence to those developers who just started using VueJs. Even worse, due to the recent version up of Webpack to 2.x, we might need a new tutorial to build a VueJs application using TypeScript. In this post, our goal will be:
- To use the basic template provided by VueJs,
- To use Webpack version 2.x, and
- To run the app on ASP.NET Core.
The sample code used in this post can be found at here.
Prerequisites
We have already built a VueJs application running on ASP.NET Core in the previous post. So we’re going to re-use that.
Update on March 6th, 2017: We updated the TypeScript version to
2.2.1
for this post.
Installing npm Packages
TypeScript
We can install TypeScript locally only for this application:
Or we can install it globally:
If TypeScript is installed globally, we should link it to this application:
ts-loader
ts-loader
offers us to load .ts
files to .js
file without actually building them during the development time.
vue-class-component
& vue-property-decorator
If we want to use .ts
in our VueJs development, as the official document recommends, we should install the vue-class-component
library for class decorators.
It may be necessary to install vue-property-decorator
to extend vue-class-component
. This is not relevant to this post, though.
vue-typescript-import-dts
TypeScript needs type definitions. vue-typescript-import-dts
helps recognise .vue
files as .ts
.
All necessary npm packages are installed. Let’s move on.
Configurations for TypeScript
tsconfig.json
In order to use .ts
, we firstly need tsconfig.json
. In this post we just use the bare minimum settings to work. Further details about tsconfig.json
can be found here.
Let me explain the configuration in-depth.
- VueJs supports ECMAScript 5. Therefore, we need to target TypeScript to
es5
. It means that module should beCommonJs
as well aslib
should includedom
,es2015
andes2015.promise
. types
declares custom type definitions. As we’ve installedvue-typescript-import-dts
, include it here so that the application can recognise.vue
files as.ts
files.- In order to use class decorators, we’ve installed
vue-class-component
. But this is not enough. We need to enable it by setting theexperimentalDecorators
value to betrue
. - Within the
include
property, we need to declare which directories are considered containing.ts
files.
Update on March 6th, 2017 Due to the version update of VueJs to 2.2.x
, tsconfig.json
also needs to be updated. This is the recommended configuration from the official guide.
Also, please make sure that we create the template from vue-cli
by running vue init webpack
. It installs vue@2.2.1
and vue-router@2.2.0
. If those versions are different, please update them.
.eslintignore
While developing apps in TypeScript, .js
files are automatically compiled and generated. But it’s not guaranteed those files comply to linting process. Therefore, we can’t be sure if those generated .js
files are ESLint compliant or not. Therefore, to avoid linting errors from those generated .js
files, we just turn it off by adding a line, src/**/*.js
, to .eslintignore
.
We just completed basic configurations for TypeScript compiling. Let’s move on.
Converting JavaScript to TypeScript
It’s time to convert existing .js
files in the src
directory to .ts
ones situated. We’ll only look after both build
and src
directories.
build/webpack.base.conf.js
As Webpack is the only service to refer this file, so it’s not necessary to change this to .ts
. But we do need to modify it.
First of all, the entry point should be changed from main.js
to main.ts
:
Then we need to replace the babel-loader
part with the ts-loader
one:
Every .ts
file is handled by this loader. Here’s an interesting option, appendTsSuffixTo
. If we use this, .vue
files can be treated as .ts
ones. VueJs uses the Single File Component approach – all HTML section, JavaScript section, and CSS sections are put in one single file called .vue
. Therefore we need to handle it to be a TypeScript file, particularly for the JavaScript section.
We’ve completed webpack configuration to enable TypeScript handling. Let’s really convert JavaScript files to TypeScript ones.
src/main.js
– src/main.ts
Change the existing JavaScript syntax to the one for TypeScript like:
Spot on the new Vue({ ... })
part. Instead of template
and components
, the render
function is placed. Everything has been compiled before hitting this point, and each component needs more control by itself, so we just use the render
function. For more details about the render
function, please refer to the official document.
Updated on March 6th, 2017: Due to the version update of VueJs to 2.2.x
, the import statements part needs to be updated like below:
src/router/index.js
– src/router/index.ts
We don’t have to worry about this. Just be cautious when using import ...
.
Updated on March 6th, 2017: Due to the version update of VueJs to 2.2.x
, the import statements part needs to be updated like below:
src/App.vue
– src/App.ts
Instead of using one single .vue
file, we’re separating the TypeScript part from each .vue
. Why are we doing this, by the way? We can still use .vue
indeed. But for better maintainability, we’d better to create a separate .ts
file. Let’s have a look how we can implement App.ts
that is extracted from App.vue
.
@Component
decorator contains the name
declaration so that the router can easily recognise it. The script
part in the original App.vue
can be altered like this:
Make sure that we should include lang="ts"
as an attribute of the script
tag.
Updated on March 6th, 2017: Due to the version update of VueJs to 2.2.x
, the import statements part needs to be updated like below:
src/components/Hello.vue
– src/components/Hello.ts
Now, we’re going to extract the script
section from Hello.vue
to Hello.ts
. Let’s have a look.
Likewise, @Component
contains the name
declaration. Previously all two-way binding fields were defined within the data
function. Using properties makes them more class-friendly. Functions became methods.
Maybe someone indicates a small change, comparing to the previous post. In order to use AJAX requests and responses, we used
vue-resource
. However, it’s changed toaxios
. According to the official VueJs blog post,vue-resource
is no more supported as an official VueJs extension. Insteadaxios
is recommended because of its richer features. In addition to this,axios
provides TypeScript definitions, so there’s no reason not to use this. Its usage is almost identical tovue-resource
.
Once Hello.ts
is extracted, the original Hello.vue
should now be changed to:
Updated on March 6th, 2017: Due to the version update of VueJs to 2.2.x
, the import statements part needs to be updated like below:
All done for conversion from JavaScript to TypeScript! It seems that we’ve done fairly massive conversion. The basic template is optimised to JavaScript, so what we’ve done so far is basically the conversion job. From now on, we can write all logic using TypeScript!
Press F5 key on your Visual Studio to run the application and see the result.
The right-hand side of the window on the picture above is Vue.js devtools, which is a Chrome extension. When we install it, we can use it right away through Chrome’s Developer Tools.
One More Thing …
So far, we’ve done the conversion of VueJs to TypeScript. As this is for local development environment, we need one last modification for deployment. Here’s the overall process of building applications for deployment:
- To compile
.ts
files and generate corresponding.js
ones. - To modularise and build bundles through webpack.
- To build ASP.NET Core libraries.
- To generate an artifact for deployment to Azure or IIS.
- To deploy.
By updating package.json
and project.json
we can easily achieve this goal.
package.json
Within package.json
, the scripts
was originally looking like:
We need to add another one for TypeScript compilation. Let’s change it like:
build:ts
is to compile.ts
files.build:main
is to be responsible for existing build.build
is to change to call bothbuild:ts
andbuild:main
consecutively.--no-deprecation
flag may bring an attention. When compiling,ts-loader
throws a deprecation warning. It’s OK but Visual Studio treats it as an error so build/deploy fails. By providing this flag will enable build/deploy through Visual Studio successfully.
project.json
Finally, open project.json
to confirm the prepublish
section.
All good now! After the deployment to Azure Web App, we can see the following screen:
Of course, if CI/CD is preferred, we can simply use dotnet publish
feature.
We’ve so far had a quick look to write a VueJs application in TypeScript, bundle it on ASP.NET Core and deploy it to Azure. As mentioned earlier, the very first part is a bit complicating but it’s not that different from normal TypeScript development. Let’s build a real world application using VueJs and TypeScript!!