`

[译]使用NPM和Webpack搭建Angular2工程

阅读更多

原创翻译,转载请注明出处。

原文标题:Angular2 with NPM and Webpack

原文地址:https://www.illucit.com/blog/2016/06/angular2-npm-webpack/

 

这篇文章演示了怎样使用Webpack来配置Angular2工程。这些配置还包含了TypeScript,Less,CSS(例如Bootstrap)和字体(例如FontAwesome)。

 

  • 必须的NPM包

Webpack需要的所有依赖,都放到package.json的devDependencies里,这样的话NPM就能自动安装它们。

 

package.json

{
  "version": "1.0.0",
  "name": "faces",
  "dependencies": {
    "@angular/common": "^2.0.0-rc.1",
    "@angular/compiler": "^2.0.0-rc.1",
    "@angular/core": "^2.0.0-rc.1",
    "@angular/http": "^2.0.0-rc.1",
    "@angular/router": "^2.0.0-rc.1",
    "@angular/platform-browser": "^2.0.0-rc.1",
    "@angular/platform-browser-dynamic": "^2.0.0-rc.1",
    "core-js": "2.2.2",
    "rxjs": "5.0.0-beta.6",
    "reflect-metadata": "0.1.3",
    "zone.js": "0.6.12"
    "jquery": "2.2.3",
    "bootstrap": "3.3.6",
    "font-awesome": "4.6.1"
  },
  "devDependencies": {
    "ts-loader": "0.8.2",
    "typescript": "1.8.10",
    "typings": "0.7.12",
    "webpack": "1.12.15",
    "es6-promise": "3.1.2",
    "es6-shim": "0.35.0",
    "extract-text-webpack-plugin": "1.0.1",
    "file-loader": "0.8.5",
    "gulp": "3.9.1",
    "less": "^2.6.1",
    "less-loader": "2.2.3",
    "style-loader": "0.13.1",
    "url-loader": "0.5.7",
    "webpack-merge": "0.8.4",
    "webpack-stream": "3.1.0"
  }
}

 

用NPM把所有的开发依赖包都安装完之后,我们就开始配置Webpack。

 

  • 配置Webpack

webpack.config.js

var webpack = require('webpack');
var path = require('path');
var ExtractTextPlugin = require("extract-text-webpack-plugin");

// Webpack Config
var webpackConfig = {
  entry: {
	'polyfills':       './wwwroot/polyfills.ts',
	'vendor':          './wwwroot/vendor.ts',
	'app':             './wwwroot/app.ts',
	'vendor-style':    './wwwroot/style/vendor-style.ts',
	'app-style':       './wwwroot/style/app-style.ts',
  },

  devtool: 'source-map',
  
  cache: true,
  output: {
	path: './wwwroot/dist',
	filename: '[name].bundle.js',
	sourceMapFilename: '[name].map',
	chunkFilename: '[id].chunk.js'
  },

  resolve: {
	extensions: ['', '.ts', '.js']
  },

  plugins: [
 
	new webpack.optimize.CommonsChunkPlugin({ name: ['app', 'vendor', 'polyfills'], minChunks: Infinity }),
	new ExtractTextPlugin("[name].css"),
	new webpack.optimize.DedupePlugin()
  ],

  module: {
	loaders: [
	  // .ts files for TypeScript
		{ test: /\.ts$/, loader: 'ts-loader' },
		{
			test: /\.css$/,
			loader: ExtractTextPlugin.extract("style-loader", "css-loader")
		},
		{
			test: /\.less$/,
			loader: ExtractTextPlugin.extract("style-loader", "css-loader!less-loader")
		},
		{ test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file" },
		{ test: /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/, loader:"url?prefix=font/&limit=5000" },
		{ test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/octet-stream" },
		{ test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=image/svg+xml" }
	]
  }

};

var webpackMerge = require('webpack-merge');
module.exports = webpackMerge(webpackConfig);

 对这个配置文件的一些说明。在我的这个Angular2程序里,打包所有的文件需要大约30秒。如果在你每次修改文件之后都需要等20几秒也是挺浪费时间的。另外,所有下面的这些配置文件都需要放在Angular2工程的根目录下。

  

  • 分割工程

一个较好的方法,是把工程分割成polyfills文件,vendor文件和application自身文件。这种方式,在你每次修改都需要打包的时候,会节省不少时间。所以Webpack配置文件里包含了下面的命令:

 

new webpack.optimize.CommonsChunkPlugin({ name: ['app', 'vendor', 'polyfills'],

 

Webpack会为每一个entry文件创建一个依赖图。已经包含在polyfills里的依赖将不会被再次放入vendor文件里。同样,已经包含在vendor和polyfills里的依赖将不会被加到app文件里。

 

polyfills和vendor文件是什么样子的呢:

 

polyfills.ts 

import 'core-js';
import 'zone.js/dist/zone';

 

vendor.ts 

import "@angular/common";
import "@angular/compiler";
import "@angular/core";
import "@angular/http";
import "@angular/router";
import "@angular/platform-browser";
import "@angular/platform-browser-dynamic";

import 'rxjs/Rx';

  

为了能然Webpack能编译TypeScript文件,你需要引入一个特殊的loader去复制.ts文件。下面的Webpack设定文件的loader部分的设定会达到这个目的。

 

{ test: /\.ts$/, loader: 'ts-loader' },

 这些loader是包含在package.json文件的devDependencies部分的npm包列表里。

  

  • 支持Less和CSS

配置文件里还包含了一些less和css的loader,例如:

 

{
   test: /\.css$/,
   loader: ExtractTextPlugin.extract("style-loader", "css-loader")
},
{
   test: /\.less$/,
   loader: ExtractTextPlugin.extract("style-loader", "css-loader!less-loader")
},

 为了把less或者css文件里使用的字体文件也打包,我还增加了一些loader,例如:

 

{ test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file" },

 这些包含了一些针对于字体文件的正则表达式。例如bootstrap里的字体文件。

 

 除了loaders之外,我还加了vendor styles 和app styles两个enter点。

 

vendor-style.ts 

import 'bootstrap/dist/css/bootstrap.css';
import 'font-awesome/less/font-awesome.less';

 

app-style.ts 

import './app.less';

 

 

  • 配置TypeScript

为了完整起见,我把tsconfig.json也贴出来。

 

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    "outDir": ".",
    "rootDir": ".",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "moduleResolution": "node"
  },
  "exclude": [
    "typings/main.d.ts",
    "typings/main",
    "node_modules"
  ],
  "compileOnSave": false,
  "buildOnSave": false,
  "atom": { "rewriteTsconfig": false }
}

 

 

  • 配置Typings

Typings继承与tsd。它用来取得用纯javascript写成的库定义文件。你可以用typings命令行工具来为增加的库引入不同的typing定义。

 

typings.json

{
  "name": "myapp",
  "dependencies": {
  },
  "ambientDependencies": {
    "es6-collections": "registry:dt/es6-collections#0.5.1+20160215162030",
    "es6-promise": "registry:dt/es6-promise#0.0.0+20160221190517",
    "jquery": "registry:dt/jquery#1.10.0+20160316155526"
  }
}

 

  • 使用Webpack打包

首先使用npm安装webpack。之后你可以输入下面的命令开始打包。

webpack -d

 

它将在开发模式下编译出几个包。它还包含所有输出文件的map文件。这样的话,代码就可以在浏览器里被调试。如果你使用产品模式(在命令行里使用参数 -p),输出文件的大小将变小,并且不包含map文件。

 

Output:


 

 

bundles,font等等文件,都将被输出到在Webpack配置文件里定义的目标文件夹。

你可能注意到编译花费了不少时间。那为什么我们在最初把输出文件分成几块?因为我们可以使用监视模式来启动Webpack。

 

webpack -d -w

 

最初它会打包所有的文件。当所有的编译都完了之后,Webpack仍然会以监视模式运行。当你的程序文件被修改的时候,所有被影响的部分都会被重新编译。因为我们把代码分成了polyfills, vendor files和app本身几块,所以大多数情况之后app块被编译了。这样的话能稍微节省点时间。所以在开发阶段,我建议使用监视模式。

 

 

  •  在Html页面里使用输出文件

输出块被简单的包含在你的html页面里。就像下面所示:

 

<html>
<head>
    <title>MyApp</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0" />
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <link rel="stylesheet" href="dist/vendor-style.css" />
    <link rel="stylesheet" href="dist/app-style.css" />
</head>
 <body>
    
    <myapp>
      Loading...
    </myapp>

    <script src="dist/polyfills.bundle.js"></script>
    <script src="dist/vendor.bundle.js"></script>
    <script async src="dist/app.bundle.js"></script>

  </body>
</html>

 webkack还可以使用插件,这样的话你就不用手动在你的html页面里加入输出块文件。

 

 

  • 关于输出文件大小的附注

 在我的例子里,输出文件的大小仍然比较大,开发模式有4M,产品模式下有1M。不管怎样,这些文件最初被加载之后,你的单页应用也不在需要别的依赖了。如果有人告诉我怎样去再缩小输出文件的大小,那将非常棒!

 

  • 总结

 这篇文章演示了怎样去打包一个Angular2工程。在把各个方面综合在一起的时候,花费了我一些时间。希望大家在配置Angular2工程的时候,可以节省你的时间。如果有任何问题或者评论,可以在下面提交评论。

(译者注:去原页面评论哦~)

 

 

--End--

 

0
0
分享到:
评论

相关推荐

    webpack构建angular1x

    在"webpack构建angular1.x"的场景下,我们将讨论如何使用Webpack来管理和构建Angular 1.x版本的应用。 Angular 1.x 是Google推出的前端框架,它提供了丰富的功能来构建单页应用(SPA)。然而,随着项目的复杂性增加...

    webpack-angular1.5-razroo:Webpack2 angular1.5构建

    世界上最先进的Webpack2 Angular 1.5构建系统 要使用,请运行以下命令 npm install npm run jade npm run watch 除此以外,您还必须下载chrome dev工具。 构建受中的体系结构的影响 以下是此项目的文件架构 应用...

    详解webpack+angular2开发环境搭建

    在本文中,我们将深入探讨如何搭建一个基于Webpack和Angular2的开发环境。Angular2是一个流行的前端框架,而Webpack是一个强大的模块打包工具,它们结合在一起能够为开发者提供高效、灵活的项目构建流程。在搭建过程...

    详解用webpack2搭建angular2的项目

    "description": "webpack2 & angular2", "scripts": { "dev": "babel-node ./src/config/dev.js" }, "author": "Travis Lee", "license": "ISC", "dependencies": { "@angular/common": "~4.0.0", "@...

    webpack-angular-advanced:比基本的webpack-angular应用程序高出一步,它具有更高级的Webpack和Angular功能

    webpack-角度高级 比具有更高级的Webpack和Angular功能的基本webpack-angular应用程序高出一步。 仍在思考在Webpack worldview中将模板,路由,控制器组合在一起的最佳... 帮助您开始使用Angular和Webpack的其他资源:

    angular2-webpack:Angular2-Webpack

    Angular2打字稿-业力-Webpack骨架Angular2样板项目可以帮助您入门。 使用类编写指令/控制器和服务。 使用Jasmine测试您的代码,使用sass编写样式,查看测试覆盖率等等。 该项目使用模块化体系结构,您可以在其中构建...

    该框架基于Angular20TypeScriptwebpack搭建作为脚手架的处理

    在 Angular 2.0 的世界里,使用 TypeScript 和 Webpack 构建的脚手架可以预先配置好项目的目录结构、编译设置、测试环境等,使得开发者能够立即开始编写业务代码,而无需从零开始搭建环境。 **Ng2Framework-master ...

    angular4-starter:使用Typescript和Webpack的Angular v4启动器

    使用Webpack的完整Angular 2入门程序可与JWT配合使用包括登录名,about,404,commons页眉和页脚组件,以创建通用框架 1 / # clone the repo git clone ... # change directory to your app # install the ...

    webpack-angular-template:Webpack + Angular.js应用程序模板

    使用和npm脚本。 特征: Angular + UI路由器+ Restangular ES6(与Babel编译) SASS / SCSS +自动前缀使用Karma / Jasmine / PhantomJS进行单元测试安装$ npm install在开发中运行$ npm start 默认情况下,服务器...

    npm.cnpm.webpack.nvm

    `npm`(Node Package Manager)、`cnpm`(China Node Package Manager)和`webpack`是开发者在进行JavaScript项目管理时经常使用的工具,而`nvm`(Node Version Manager)则帮助管理和切换不同的Node.js版本。...

    angular-webpack:带有Webpack的Angular入门套件

    Angular Webpack 带有的Angular入门套件入门依存关系(&gt; = 6.9.1)设置git clone https://github.com/bellizio/angular-webpack.git cd angular-webpack yarn install概述这是一个基于官方的Angular Webpack入门工具...

    angular2-webpack:Angular2 + Webpack框架

    带有Webpack的Angular 2设置npm installtsd install启动开发服务器npm startor./node_modules/.bin/webpack-dev-server导航到

    angular-wrapper:Webpack的Angular.js 1.2包装器

    Angular.js 1.3及更高版本不需要此项目安装要安装该库,只需运行: npm install --save angular-wrapper用法这是使用此包装器加载Angular.js的示例: var angular = require("angular-wrapper");var ...

    restaurant-page:NPM和Webpack项目

    在“restaurant-page”项目中,NPM的主要作用是管理各种库和框架,如React、Vue或Angular,这些库可以用于构建用户界面,展示餐厅的菜单、预订系统以及评论等功能。通过在`package.json`文件中声明依赖,NPM能够自动...

    webpack-angular-express:使用Webpack,Angular(1.x)和Express的框架应用程序

    使用Angular(1.x),Express和Webpack编写的框架应用程序。 该示例应用程序基于 ,并通过将实施为的代理来对其进行。 入门 依存关系 运行该应用程序所需的工具: node和npm这些文件后,将以下文件安装为全局变量...

    angular2-template-loader:用于webpack的链式加载器,可内嵌angular2组件中的所有html和样式

    npm install angular2-template-loader --save-dev 将angular2-template-loader到您当前使用的打字稿加载器。 loaders : [ 'awesome-typescript-loader' , 'angular2-template-loader' ] , 要求 为了能够使用模板...

    webpack-starter-angular:Webpack Starter for Angular 1.5

    Webpack Starter Angular堆NPM Webpack 角度1.5 Angular UI路由器(带有自注册组件) ES 6 / Babel(模块加载) 萨斯玉测试-卡玛(测试运行, ) -摩卡(测试框架, ) -柴(BDD / TSS断言库, )要求去做: SASS...

    angular-pug-scss-webpack:使用Pug,SCSS和Webpack运行Angular的样板代码

    在本文中,我们将深入探讨如何使用Angular框架与Pug(原名Jade)作为模板引擎、SCSS(Sass的预处理器)进行样式编写,并通过Webpack进行模块打包。这是一个高效且现代化的前端开发配置,旨在提升开发效率和代码可...

Global site tag (gtag.js) - Google Analytics