Angular中使用webpack

最近,在开发公司项目的时候,由于组件太多,发出请求太多,导致网站速度太慢,所以我们就有一种强烈的需求,那就是对开发的js进行打包。在对比了各种打包工具之后,最后我们选定了webpack。所以,在这一周除了研究了下如何跨域请求,最主要的时间都去研究webpack去了,虽然没有达到理想中的状态,但是基本的需求应该算是满足了,现在分享出来,希望对大家学习Angular有所帮助。

在正文之前,我先说下,我要分享的内容有:

· webpack在Angular中使用

· 建立开发环境与生产环境

· 优化打包性能,将第三方库与开发的代码分离

· 对代码进行压缩

· 一些第三方框架的集成

· webpack解决缓存问题,上线后自动使用最新的js文件

首先,克隆demo项目,并安装依赖

git clone https://github.com/liuchungui/angularWebpackDemo.gitcd angularWebpackDemo

git checkout -f step0

npm install

然后,编写webpack配置文件

创建webpack.config.js文件,并且编写如下内容:

const webpack = require("webpack");

module.exports = {

//入口文件

entry: "./demoApp.js",

//生成的文件配置

output: {

//生成文件的路径,__dirname是当前项目路径,与webpack.config.js同级

path: __dirname,

//文件名

filename: "bundle.js"

},

module: {

//将css文件打包进去

loaders: [

{ test: /\.css$/, loader: "style!css" }

]

},

plugins: [

/**

* 此插件会自动加载jquery,解决jquery无法引用的问题

*/

new webpack.ProvidePlugin({

$: "jquery",

jQuery: "jquery"

})

]

};

上面用到的配置选项大概说一下:

· entry:入口文件,可以传字符串,那说明入口文件只有一个;也可以传数组或对象,指定多个入口文件

· output: 生成打包文件的配置,可以指定path(路径),当有多个入口文件时,还可以使用[name]、[hash]、[chunkhash]等值,来对应替换为入口的文件的配置 。

· loaders: 它可以转换项目中的资源文件,例如,上面就是css样式文件转换为style标签插入到html当中。

· plugins: 插件,它可以干很多很多的事情,非常强大,官方提供了很多插件,第三方也可以写插件。上面的 ProvidePlugin 插件的作用是自动加载jquery模块,也就是说将jquery变成了全局的模块,当然我们需要在index.html中使用script标签导入。

随后,导入使用

首先,我们在 index.html 中导入 bundle.js :

<script src="bundle.js">script>

然后,我们不需要在index.html中导入js文件了,只需要使用 require 导入模块就行,webpack会自己解决它们之间的依赖。例如,我们在demo项目中的demoApp.js中导入 angular 和 bootstrap 。

’use strict’;require("angular");require("bootstrap");

var demoApp = angular.module(’demoApp’, []);

当然,上面的require(“angular”)导入的是 node_modules 中的angular模块,如果我们要导入本地的js文件,怎么办?如下:

require("./test");

这种方式还有一个用法,那就是我们可以将共用的第三方库、组件写入一个文件中,然后其它文件只需要导入这个文件一次就行了。

例如,上面我们可以建立一个 common.js 文件,然后导入 angular 和 bootstrap,common.js内容如下:

require("angular");require("bootstrap");

然后在 demoApp.js 中使用:

’use strict’;require(’./common’);

var demoApp = angular.module(’demoApp’, []);

效果是一样的,但这种方式解决了非常的棒,解决了我曾经的一个痛点,那就是我们项目分角色有很多个端,每个端有共同的内容,当写一个组件时,我们需要每个端都在index.html中导入一遍,非常的不方便。

注:由于jquery没有模块化的概念,也没有适配webpack,所以我们使用jquery时,需要在index.html中导入,然后使用 ProvidePlugin 插件使其自动加载。

最后,打包运行

打包只需要在项目根目录下运行:

webpack --progress --color

它默认会使用当前目录下的 webpack.config.js 配置文件,运行成功之后,它会生成一个 bundle.js 打包文件。

我们可以在浏览器访问,就可以看到效果,这就说明OK了。

当然,我们开发时,需要实时看到改变代码的效果,这个时候每次都打包生成就太麻烦了。那么就可以用到webpack专门为我们准备的调试命令:

webpack-dev-server

然后在浏览器中输入 http://localhost:8080/ 就可以看到效果了。

其实,除了这种,还有另外一种也可以进行调试,那就是监听模式:

webpack --progress --color --watch

监听模式下,我们的js文件发生改变时,它会监听到,然后重新打包。

另外,多个客户端,配置多个入口文件

在我们公司项目中,有很多个客户端,我把它们配置成了多个入口文件,那么如何配置多个入口文件?如下:

const webpack = require("webpack");

module.exports = {

//入口文件

entry: {

demoApp: "./demoApp.js",

vendor: "./vendor.js"

},

//生成的文件配置

output: {

//生成文件的路径,__dirname是当前项目路径,与webpack.config.js同级

path: __dirname,

//文件名

filename: "[name].bundle.js"

}

};

它们将生成 demoApp.bundle.js 和 vendor.bundle.js 两个打包文件。

查看最终效果

如果想查看demo的最终效果,如下运行命令:

git checkout -f step1

npm install

webpack --progress --color

总结

刚开始看了官方文档入门之后,感觉自己会用了,但是却不知道如何用在Angular上面。后来查看了别人的代码之后,发现与 react-native 类似,都是使用 require 语法使用(CommonJS语法),豁然开朗。之后,发现很多第三方框架都适配了 webpack ,唯独jquery不行,找了 stackoverflow 上面的解决方案顺利解决。就这么折腾下来,然后产生了这么一篇文章,希望对大家能有所帮助。当然,东西不止这么点,后续再更新出来。而且,我也会继续,直到整个webpack配置达到我理想中的状态。

来源:liuchungui’s Blog

时间: 2024-11-05 06:07:08

Angular中使用webpack的相关文章

(七)理解angular中的module和injector,即依赖注入

依赖注入(DI)的好处不再赘言,使用过spring框架的都知道.angularjs作为前台js框架,也提供了对DI的支持,这是javascript/jquery不具备的特性.angularjs中与DI相关有angular.module().angular.injector(). $injector.$provide.对于一个DI容器来说,必须具备3个要素:服务的注册.依赖关系的声明.对象的获取.比如spring中,服务的注册是通过xml配置文件的<bean>标签或是注解@Repository.

angular中的通信方式

在项目中,我们可能会很经常性的利用到控制器之间的相互通信,在angular中的控制器之间的相互通信有以下几种方式: 1)通过本地数据的存储localstorage,sessionstorage, 2)通过rootScope,顶级作用域 3)通过$broadcast,$on,$emit的方式进行通信 在此就讲解下如何通过第三种方式进行通信的问题: $broadcast:顾名思义是广播的意思,一般用于父级控制器向子控制器传递信息的方法. $emit:主要是用于子控制器向父控制器传递信息的方法. $o

angular中的路径问题

我们在写项目时会遇到启动页调到引导页,引导页再调到首页, 那我们在用angular框架写这种东西的时候如果我们不细心的话就会遇到问题, 比如说找不到引导页的图片等等. 那我们怎么解决这个问题呢? 首先我们要明确,我们使用的angular框架所以我们应该使用angular中的框架来解决这个问题, 而不是还是按照原来的思想按部就班的使用路径跳转. 下面我们就来看一下, 1.启动页跳到引导页 app.controller("zeroController",function ($timeout

Angular中的jsonp

1.一般我们使用Angualr中的jsonp值这样使用的:注入$http服务 这样使用jsonp的方式可以支持多数api,但是douban不支持无法使用 1 module.controller('InTheatersController',['$scope','$http', function($scope,$http){ 2 4 var doubanApiAddress = 'https://api.douban.com/v2/movie/in_theaters'; 5 6 /!*在angua

angular中自定义依赖注入的方法和decorator修饰

自定义依赖注入的方法 1.factory('name',function () { return function(){ } }); 2.provider('name',function(){ this.$get=function(){ return function(){ } }; }); 3.service('name',function(){ this.n=v; }); 4.constant('name','value'); 5value('name','value'); 依赖的继承  

angular中的动画效果

用angular来形成动画效果的代码如下 <!DOCTYPE html> <html lang="en" ng-app="app"> <head> <meta charset="UTF-8"> <title></title> <style> .box { width: 100px; height: 100px; background: red; } </st

利用IdentityServer3在ASP.NET 5和Angular中实现OAuth2 Implicit Flow

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:之前介绍过的IdentityServer3虽然是基于Katana开发的,不过同样可以托管在ASP.NET 5中运行.今天推荐的这篇文章就是介绍如何在ASP.NET 5和Angular中实现OAuth2的Implicit Flow验证的. IdentityServer之前介绍过,是一个功能完备的.NET开源OpenID Connect/OAuth 2.0框架.IdentityServer3是基于

Angular 中得 scope 作用域梳理

$scope 的使用贯穿整个 Angular App 应用,它与数据模型相关联,同时也是表达式执行的上下文.有了 $scope 就在视图和控制器之间建立了一个通道,基于作用域视图在修改数据时会立刻更新 $scope,同样的 $scope 发生改变时也会立刻重新渲染视图. 有了 $scope 这样一个桥梁,应用的业务代码可以都在 controller 中,而数据都存放在controller 的 $scope 中. $rootScope Angular 应用启动并生成视图时,会将根 ng-app 元

在angular中使用swiper插件轮播无效的原因

我在angular中使用swiper插件时总会出现轮播不运行. 做项目么,肯定会使用路由实现切换的效果,我在做项目时总喜欢先把内容渲染在主页面上,当所要实现的效果都实现时,然后再把数据拿出来放在子页面上,通俗的讲就是把他放在另一个页面上,通过路由去获取信息. 1.在用路由中实现时一定要在路由里加上控制器controller 1 app.config(function ($routeProvider) { 2 $routeProvider.when('/index', { 3 templateUr