Angular (SPA) WebPack模块化打包、按需加载解决方案完整实现
文艺小说-?2F,言情小说-?3F,武侠小说-?9F
long long ago time-1-1:A 使用工具,long long A ago time-1-2:A 使用分类工具,long long ago time-1-3:A 使用一键构建工具 (js组件构建)
long long ago time-2-1:B 使用工具,long long A ago time-2-2:B 使用兼容工具,long long ago time-2-3:B 使用一键构建工具 (cs样式兼容)
前端正在由蛮荒步入高阶时代!
读在最前面:
1、本文讲述Angular,Webpack 模块化、按需加载案例,移步Vue
2、阅读本文,读者应了解Angular、WebPack,!移步 我乃webpack
3、此文建立在已有node环境,sass环境,webpack环境下,特此说明
4、此文适合那些对前端优化(按需加载、请求合并、文件指纹、CDN部署、、首屏CSS内嵌 and so on)、组件化、工程化有一些思考的同学
5、技术点:angular、webpack、oclazyload、sass、autoprefixer
6、以下代码只帖出关键代码,下载完整项目,请拉到最底部!
构建Angular,Fire!
1、创建angular入口文件,app.js
描述:
(1)、第三方样式依赖:font-awesome
(2)、第三方js依赖:angular,angular-ui-router,oclazyload
(3)、业务逻辑、公共组件依赖:routing.js,directive.js
'use strict';
require('../../node_modules/font-awesome/css/font-awesome.min.css'); angular.module('app', [
require('angular-ui-router'),
require('oclazyload'),
require('./routing.js'),
require('./directive.js')
])
.config(function($urlRouterProvider, $locationProvider) {
$urlRouterProvider.otherwise("home");
$locationProvider.html5Mode(true);
});
2、创建路由配置文件,routing.js
'use strict';
module.exports = angular.module('app.controllers', [
require('../view/home/_service.js'),
require('../view/main/_service.js')
]).name;
3、创建home路由文件,_service.js
描述:
(1)、使用require.ensure实现异步加载 see more
(2)、使用ocLazyLoad加载业务控制
'use strict';
module.exports = angular.module('app.home', []).config(function($stateProvider) {
$stateProvider.state('home', {
url: '/home',
templateProvider: function($q) {
var deferred = $q.defer();
require.ensure(['./home.html'], function(require) {
var template = require('./home.html');
deferred.resolve(template);
}, 'home-tpl');
return deferred.promise;
},
controller: 'homeCtrl',
controllerAs: 'vm',
resolve: {
'app.home': function($q, $ocLazyLoad) {
var deferred = $q.defer();
require.ensure(['./home.js'], function() {
var mod = require('./home.js');
$ocLazyLoad.load({
name: 'app.home'
});
deferred.resolve(mod.controller);
}, 'home-ctl');
return deferred.promise;
}
}
});
}).name;
4、创建控制器文件,home.js
'use strict';
module.exports = angular.module("app.home").controller("homeCtrl", function() {
this.test = function() {
alert(this.name);
}
}).name;
构建WebPack,Fire!
1、创建环境Json
{
"name": "front-solution",
"version": "1.0.0",
"description": "front-solution",
"main": "index.js",
"scripts": {
"build": "set NODE_ENV=build&&webpack -p --progress --colors",
"test": "set NODE_ENV=test&&webpack -p --progress --colors",
"dev": "set NODE_ENV=dev&& webpack-dev-server --hot --progress --colors --host 0.0.0.0 --port 8080"
},
"keywords": [
"front-solution"
],
"author": "lufeng",
"license": "ISC",
"devDependencies": {
"autoprefixer": "^6.6.0",
"clean-webpack-plugin": "^0.1.14",
"css-loader": "^0.26.1",
"extract-text-webpack-plugin": "^1.0.1",
"file-loader": "^0.9.0",
"font-awesome": "^4.7.0",
"html-webpack-plugin": "^2.24.1",
"ng-annotate-webpack-plugin": "^0.1.3",
"node-sass": "^4.1.1",
"postcss-loader": "^1.2.1",
"raw-loader": "^0.5.1",
"sass-loader": "^4.1.1",
"style-loader": "^0.13.1",
"url-loader": "^0.5.7",
"webpack": "^1.14.0",
"webpack-dev-server": "^1.16.2"
},
"dependencies": {
"angular": "^1.6.1",
"angular-ui-router": "^0.3.2",
"oclazyload": "^1.0.9"
}
}
2、创建打包步骤
var webpack = require('webpack'),
HtmlWebpackPlugin = require('html-webpack-plugin'), //模板插件
ExtractTextPlugin = require("extract-text-webpack-plugin"), //Css分割插件
CleanWebpackPlugin = require('clean-webpack-plugin'), // 删除插件
NgAnnotatePlugin = require('ng-annotate-webpack-plugin'), //自动注入注解插件
autoprefixer = require('autoprefixer'),
path = require('path'),
buildPath = path.resolve(__dirname, "build"), //发布目录
__DEV__ = process.env.NODE_ENV === 'dev', //发布环境
publicPath = '', //资源引用统一前缀
devtool = '', //source-map模式
plugins = [
new HtmlWebpackPlugin({
chunks: ['app', 'vendor'],
template: __dirname + '/www/template/index.html',
filename: './index.html'
}),
new HtmlWebpackPlugin({
chunks: ['app', 'vendor'],
template: __dirname + '/www/template/mobile.html',
filename: './mobile.html'
}),
new webpack.optimize.CommonsChunkPlugin('vendor', 'script/vendor.[hash:6].js'),
new ExtractTextPlugin("/css/styles.[hash:6].css"),
new CleanWebpackPlugin('build', {
verbose: true,
dry: false
}),
new NgAnnotatePlugin({
add: true
})
];
if (!__DEV__) {
//压缩
plugins.push(new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
}));
publicPath = process.env.NODE_ENV == 'test' ? 'test.domain.com' : 'www.domain.com';
devtool = 'source-map';
}
var config = {
//入口文件配置
entry: {
app: path.resolve(__dirname, 'www/app/app.js'),
vendor: ["angular", 'angular-ui-router', 'oclazyload']
},
//文件导出的配置
output: {
path: buildPath,
filename: "script/[name].[hash:6].js",
publicPath: publicPath,
chunkFilename: "chunks/[name].chunk.[chunkhash].js"
},
//本地服务器配置
devServer: {
historyApiFallback: true,
hot: true,
inline: true,
grogress: true
},
//模块配置
module: {
loaders: [{
test: /\.html$/,
loader: 'raw'
}, {
test: /\.(png|jpg|gif)$/,
loader: 'url?limit=8192,name=/img/[name].[hash:6].[ext]'
}, {
test: /\.(woff|woff2|eot|ttf|svg)(\?.*$|$)/,
loader: 'url-loader?importLoaders=1&limit=1000&name=/fonts/[name].[ext]'
}, {
test: /\.css$/,
loaders: ['style', 'css'],
}, { //外链
test: /\.scss$/,
loader: ExtractTextPlugin.extract("style-loader", "css-loader!sass-loader!postcss-loader")
}
// ,{ //内联
// test: /\.scss$/,
// loaders: ['style', 'css', 'sass','postcss']
// }
]
},
postcss: function() {
return [autoprefixer()];
},
//插件配置
plugins: plugins,
//调试配置
devtool: devtool
}
module.exports = config;
备注:
1、原理说明:webpack采用依赖(require)来进行项目构建,一切皆require,它会根据你在webcofig中配置的js入口文件进行检索,然后构建出你整个资源环境。
2、配置说明:
(1)、angular构建中,按需加载主要涉及:require,ocLazyLoad
(2)、webpack构建中,主要涉及插件包括:html模板、css分隔、自动注解、目录删除、文件压缩、文件指纹
(3)、webpack构建中,主要涉及loader包括:css、sass、postcss、file、url、style、raw
by:海豚湾-丰
Angular (SPA) WebPack模块化打包、按需加载解决方案完整实现的更多相关文章
- webpack中实现按需加载
webpack中的require.ensure()可以实现按需加载资源包括js,css等,它会给里面require的文件单独打包,不和主文件打包在一起,webpack会自动配置名字,如0.js,1.j ...
- 深入浅出的webpack4构建工具---webpack+vue+router 按需加载页面(十五)
1. 为什么需要按需加载? 对于vue单页应用来讲,我们常见的做法把页面上所有的代码都打包到一个bundle.js文件内,但是随着项目越来越大,文件越来越多的情况下,那么bundle.js文件也会越来 ...
- webpack学习笔记--按需加载
为什么需要按需加载 随着互联网的发展,一个网页需要承载的功能越来越多. 对于采用单页应用作为前端架构的网站来说,会面临着一个网页需要加载的代码量很大的问题,因为许多功能都集中的做到了一个 HTML 里 ...
- React Router 4.0 + webpack 实现组件按需加载
网上关于React Router 4.0的按需加载文章有很多,大致的思路都一样,但是其实具体实现起来却要根据自己的实际情况来定,这里主要介绍一下我的实现方式. 主要方式是通过Route组件的rende ...
- webpack require.ensure 按需加载
使用 vue-cli构建的项目,在 默认情况下 ,会将所有的js代码打包为一个整体比如index.js.当使用存在多个路由代码的时候,index.js可能会超大,影响加载速度. 这个每个路由页面除了i ...
- webpack 事件触发 按需加载
比较易懂, 方法简单 var util_sync = require('./util-sync.js') alert(util_sync.data) document.getElementById(& ...
- webpack 配置echarts 按需加载
引入babel-plugin-equire插件,方便使用.yarn add babel-plugin-equire -D 在.babelrc文件中的配置 { "presets": ...
- react-route4 按需加载配置心得
本篇文章主要记录笔者项目中使用 react-route + webpack 做路由按需加载的心得,可能只有笔者一个人看,权当日记了. 很久很久以前,react-route还是2.X和3.X版本的时 ...
- Vue.js中用webpack合并打包多个组件并实现按需加载
对于现在前端插件的频繁更新,所以多多少少要对组件化有点了解,下面这篇文章主要给大家介绍了在Vue.js中用webpack合并打包多个组件并实现按需加载的相关资料,需要的朋友可以参考下. 前言 随着 ...
随机推荐
- 使用TSQL查询和更新 JSON 数据
JSON是一个非常流行的,用于数据交换的文本数据(textual data)格式,主要用于Web和移动应用程序中.JSON 使用“键/值对”(Key:Value pair)存储数据,能够表示嵌套键值对 ...
- HTML DOM 介绍
本篇主要介绍DOM内容.DOM 节点.节点属性以及获取HTML元素的方法. 目录 1. 介绍 DOM:介绍DOM,以及对DOM分类和功能的说明. 2. DOM 节点:介绍DOM节点分类和节点层次. 3 ...
- 深入Java虚拟机--判断对象存活状态
程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点 ...
- 【腾讯Bugly干货分享】Android Linker 与 SO 加壳技术
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57e3a3bc42eb88da6d4be143 作者:王赛 1. 前言 Andr ...
- Java之多态(二)
package test05;import test06.Car1;public class DuoTai_Test02 { /**多个对象,一个形态 * Tiger.Lion.Snake → Ani ...
- 我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗
文章背景,回答提问:我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗? 我的建议是这样:1. 不要辞职.首先说,你对整个开发没有一个简单的了解,或一个系统的入门学习.换句 ...
- 使用C# 和Consul进行分布式系统协调
随着大数据时代的到来,分布式是解决大数据问题的一个主要手段,随着越来越多的分布式的服务,如何在分布式的系统中对这些服务做协调变成了一个很棘手的问题.今天我们就来看看如何使用C# ,利用开源对分布式服务 ...
- 【道德经】漫谈实体、对象、DTO及AutoMapper的使用
写在前面 实体和值对象 实体和对象 故常无欲以观其妙,常有欲以观其徼 初始实体和演化实体 代码中的DTO AutoMapper实体转换 后记 实体(Entity).对象(Object).DTO(Dat ...
- 【腾讯优测干货分享】如何降低App的待机内存(二)——规范测试流程及常见问题
本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/806TiugiSJvFI7fH6eVA5w 作者:腾讯TMQ专项测 ...
- Linux 中优秀的文本化编辑思想大碰撞(Markdown、LaTeX、MathJax)
这样一个标题可能不太准确,因为确实无法准确地解释什么叫"文本化编辑思想".其实我这篇随笔主要是想探讨 Markdown.LaTeX.MathJax,有兴趣的朋友可以继续往下看,同时 ...