All about that npm no Bower
One of the many new features of ASP.NET 5, and the "new" Microsoft as some would call it, is the implementation or integration of the open tooling and other package managers in the OSS world. Node, grunt, gulp and Bower are terms not unbeknownst to web developers using other platforms.
However, with all of this comes more setup or management of tooling or "what to use when" etc, and some of the feedback from the community within ASP.NET has been around this very topic.
Converting Web Application to use npm
Here is a quick conversion of the basic web application from using Bower to using npm.
- delete .bowerrc
Since we are not using Bower, there is no need for the file. The purpose of the file, FYI, is to set the installation location of the libraries downloaded and in this case it was set to wwwroot/lib
.
- npm install the items in bower.json
npm install bootstrap jquery jquery-validation --save
This adds bootstrap, jquery and jquery-validation to the package.json
file in the dependencies node.
,
"dependencies": {
"bootstrap": "^3.3.6",
"jquery": "^2.1.4",
"jquery-validation": "^1.14.0"
}
The last JavaScript resource used, is jquery-validation-unobtrusive from the ASP.NET team, but this is not currently available in the npm registry, however there is a pending PR to get this resolved.
In order to get it added, simply npm install with the url of the git repository.
npm install https://github.com/aspnet/jquery-validation-unobtrusive --save
There are some changes need for the gulpfile.js
setup and tasks. First, setup the configuration for the sources and destinations of the resources.
var library = {
base: "node_modules",
destination: "lib",
source: [
// glob pattern to get the dirname and match only js and min.js file wanted
path.dirname(require.resolve('ASP.NET/jquery.validate.unobtrusive.js')) + '/*unobtrusive**.js',
// alternative of declaring each file
require.resolve('bootstrap/dist/js/bootstrap.js'),
require.resolve('bootstrap/dist/js/bootstrap.min.js'),
require.resolve('bootstrap/dist/css/bootstrap.css'),
// glob pattern to get all files within the directory
path.dirname(require.resolve('bootstrap/dist/fonts/glyphicons-halflings-regular.woff')) + '/**',
// declare each file
require.resolve('jquery/dist/jquery.js'),
require.resolve('jquery/dist/jquery.min.js'),
// only one file is distributed
require.resolve('jquery-validation/dist/jquery.validate.js')
]
}
Next, we need to add the copy task to get the resources moved to \lib
folder.
gulp.task("lib", function () {
return gulp.src(library.source, { base: library.base })
.pipe(gulp.dest(paths.webroot + library.destination));
});
Add a clean:lib
task as well to follow the pattern for resetting the \lib
folder
gulp.task("clean:lib", function (cb) {
rimraf(library.destination, cb);
});
Finally, to put it all together. Add the clean:lib
task to the clean
task.
gulp.task("clean", ["clean:js", "clean:css", "clean:lib"]);
Then two additional tasks build
and default
will round out the gulp file.
gulp.task("build", ["clean", "min", "lib"]);
gulp.task("default", ["build"]);
There are no other changes needed to the project to convert from Bower to npm. By making some minor changes to the gulp file to handle copying the files; it is a very minimal change and now there is a one less repository & config file. If you are using Visual Studio 2015; a pre-build binding to the build
gulp task would be recommended as well.
Code before and after available on github: http://github.com/spboyer/bowertonpm
Comment, share, and enjoy!