Webpack之“多页面开发”最佳实战
前言:相信之前看过这篇文章,前端构建工具之“Webpack”的朋友,对于Webpack有了一定的了解。那么今天就跟大家分享下:如何利用webpack,来进行多页面项目实战开发。
一、项目初始化安装
1、先安装node.js 和 webpack
第一步:如果没有安装node的朋友,可以去node中文官网下载。安装好后,打开cmd工具,输入:
1
|
node - v // 如果有显示内容则证明安装成功(这是看我们node版本的指令) 如下图: |
第二步: 全局安装webpack
1
|
npm install webpack -g |
2、配置package.json 如果没有,可以初始化安装
1
|
npm init |
npm是node.js的一个包管理工具。(项目中所需要用到的包,都会放在node_modules文件夹下)
3、初始化package.json,添加项目所需要的模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
"devDependencies": { "babel": "^6.3.13", "babel-core": "^6.3.21", "babel-loader": "^6.2.0", "babel-plugin-transform-runtime": "^6.3.13", "babel-preset-es2015": "^6.3.13", "babel-runtime": "^5.8.34", "clean-webpack-plugin": "^0.1.10", "copy-webpack-plugin": "^3.0.1", "css-loader": "^0.23.1", "extract-text-webpack-plugin": "^1.0.1", "file-loader": "^0.8.5", "glob": "^7.0.5", "html-loader": "^0.4.3", "html-webpack-plugin": "^2.9.0", "imports-loader": "^0.6.5", "jquery": "^1.12.4", "less": "^2.7.1", "less-loader": "^2.2.3", "style-loader": "^0.13.0", "url-loader": "^0.5.7", "webpack": "^1.12.13", "webpack-dev-server": "^1.14.1" } |
4、安装模块
1
|
npm install //打开cmd命名行,进入到文件夹,进行下载项目开发所需要的模块 |
二、搭建项目结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
- demo - src #代码开发目录 - less #css目录,按照页面(模块)、通用、第三方三个级别进行组织 + common + index.less + aboout.less + list.less ... + images #图片资源 - js #JS脚本,按照page、components进行组织 + index.js + about.js + list.js ... index.html #HTML模板 about.html list.html - dist #webpack编译打包输出目录,无需建立目录可由webpack根据配置自动生成 + css + js +images index.html about.html list.html + node_modules #所使用的nodejs模块 package.json #项目配置 webpack.config.js #webpack配置 |
三、webpack相关配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
var path = require( 'path' ); var glob = require( 'glob' ); var webpack = require( 'webpack' ); var ExtractTextPlugin = require( 'extract-text-webpack-plugin' ); //将你的行内样式提取到单独的css文件里, var HtmlWebpackPlugin = require( 'html-webpack-plugin' ); //html模板生成器 var CleanPlugin = require( 'clean-webpack-plugin' ); // 文件夹清除工具 var CopyWebpackPlugin = require( 'copy-webpack-plugin' ); // 文件拷贝 var config = { entry: { //配置入口文件,有几个写几个 index: './src/js/index.js' , list: './src/js/list.js' , about: './src/js/about.js' }, output: { path: path.join(__dirname, 'dist' ), //打包后生成的目录 publicPath: '' , //模板、样式、脚本、图片等资源对应的server上的路径 filename: 'js/[name].[hash:6].js' , //根据对应入口名称,生成对应js名称 chunkFilename: 'js/[id].chunk.js' //chunk生成的配置 }, resolve: { root: [], //设置require或import的时候可以不需要带后缀 extensions: [ '' , '.js' , '.less' , '.css' ] }, module: { loaders: [ { test: /\.css$/, loader: ExtractTextPlugin.extract( 'style' , 'css' ) }, { test: /\.less$/, loader: ExtractTextPlugin.extract( 'css!less' ) }, { test: /\.js$/, loader: 'babel' , exclude: /node_modules/, query:{ presets: [ 'es2015' ] } }, { test: /\.(woff|woff2|ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/, loader: 'file-loader?name=./fonts/[name].[ext]' }, { test: /\.(png|jpg|gif|svg)$/, loader: 'url' , query: { limit: 30720, //30kb 图片转base64。设置图片大小,小于此数则转换。 name: '../images/[name].[ext]?' //输出目录以及名称 } } ] }, plugins: [ new webpack.ProvidePlugin({ //全局配置加载 $: "jquery" , jQuery: "jquery" , "window.jQuery" : "jquery" }), new CleanPlugin([ 'dist' ]), // 清空dist文件夹 new webpack.optimize.CommonsChunkPlugin({ name: 'common' , // 将公共模块提取,生成名为`vendors`的chunk minChunks: 3 // 提取至少3个模块共有的部分 }), new ExtractTextPlugin( "css/[name].[hash:6].css" ), //提取CSS行内样式,转化为link引入 new webpack.optimize.UglifyJsPlugin({ // js压缩 compress: { warnings: false } }), new CopyWebpackPlugin([ {from: './src/images' , to: './images' } //拷贝图片 ]) ], externals: { $: 'jQuery' }, //devtool: '#source-map', //使用webpack-dev-server服务器,提高开发效率 devServer: { // contentBase: './', host: 'localhost' , port: 8188, //端口 inline: true , hot: false , } }; module.exports = config; var pages = Object.keys(getEntry( './src/*.html' )); var confTitle = [ {name: 'index' , title: '这是首页标题' }, {name: 'list' , title: '这是列表标题' }, {name: 'about' , title: '这是关于我标题' } ] //生成HTML模板 pages.forEach( function (pathname) { var itemName = pathname.split( 'src\\' ) //根据系统路径来取文件名,window下的做法//,其它系统另测 var conf = { filename: itemName[1] + '.html' , //生成的html存放路径,相对于path template: pathname + '.html' , //html模板路径 inject: true , //允许插件修改哪些内容,包括head与body hash: false , //是否添加hash值 minify: { //压缩HTML文件 removeComments: true , //移除HTML中的注释 collapseWhitespace: false //删除空白符与换行符 } }; conf.chunks = [ 'common' , itemName[1]] for ( var i in confTitle) { if (confTitle[i].name === itemName[1]) { conf.title = confTitle[i].title } } config.plugins.push( new HtmlWebpackPlugin(conf)); }); //按文件名来获取入口文件(即需要生成的模板文件数量) function getEntry(globPath) { var files = glob.sync(globPath); var entries = {}, entry, dirname, basename, pathname, extname; for ( var i = 0; i < files.length; i++) { entry = files[i]; dirname = path.dirname(entry); extname = path.extname(entry); basename = path.basename(entry, extname); pathname = path.join(dirname, basename); entries[pathname] = './' + entry; } return entries; } |
四、页面开发
在我们的开发目录,新建所需要的页面, 以index.html 为例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
HTML: <!DOCTYPE HTML> < html > < head > < meta charset = "UTF-8" > < title ><%= htmlWebpackPlugin.options.title %></ title > < meta name = "keywords" content = "" /> < meta name = "description" content = "" /> < meta name = "baidu-site-verification" content = "wczeFssEiy" /> < meta http-equiv = "Cache-Control" content = "no-transform " /> < meta http-equiv = "Cache-Control" content = "no-siteapp" /> </ head > < body > < div id = "test" > 这是首页 < p > 这是一个段落说明! </ p > </ div > </ body > |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
CSS: @charset "utf-8" ; /* * @description: 首页 * @author: duanliang * @updateTime: 2016-9-3 */ /*变量定义*/ @ width : 500px ; @ color : #333 ; @fontSize: 16px ; #test { width : @width; height : 100px ; border : 1px solid #ccc ; color : @color; font-size : @fontSize; margin : 30px auto ; p.info { background-color : #f34 ; color : @color; } } |
1
2
3
4
5
6
|
Javascript: //引入css require( "../less/global" ); require( "../less/index" ); $( 'body' ).append( '这是js动态生成的内容:这是index页面!' ) |
直接运行命令: npm run dev 指令,不出意外。直接访问http://localhost:8188/ 即可看到如下效果:
因为之前,就把运行命令写在package.json中
1
2
3
4
|
"scripts" : { "dev" : "webpack-dev-server --progress --colors --inline" , //开发模式 "build" : "webpack -p" // 编译打包 } |
可能有些朋友会好奇,为什么在我们HTML模板中,没有写入任何CSS、JS链接。为什么可以在运行时候看到效果呢?
那是因为webpack帮我做了这一切,它会自动帮我们注入到模板里面。
接下来,我们运行下 npm run build 指令,看生成的页面时候一个什么样子?
Github下载: 点击下载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
使用方式: 1、下载后,解压安装包。 2、打开cmd命名行,进入到解压目录。 3、输入指令 npm install 安装项目所依赖的包 4、安装成功,运行指令 npm run dev 5、运行成功。浏览器输入:http: //localhost:8188/ 即可看到效果 备注:页面切换的话,直接域名+页面名称即可。 比如: http: //localhost:8188/index.html //首页 http: //localhost:8188/about.html //关于我页面 http: //localhost:8188/list.html //列表页面 |
写在最后:可能有了解前端构建工具的朋友,会提出这样的问题:“webpack与gulp的区别是什么?”其实这两者根本就不是一个类型的东西,所以就没有可比性。前者专注于资源模块化加载打包,推崇“一切皆模块”的理论。后者,则专注于构建。具体区别,可以自行百度(谷歌)。不过吐槽一下:webpack处理图片确实有点弱,不过这也跟它本身有点关系。如果需要对图片进行优化处理的朋友,可以采用gulp+webpack的方式来构建你的项目。
写文章不易,看似简单,仍需花非时间和精力。我想这可能也是很多人没有坚持写博客原因吧!
温习提示:由于最近前端MVVM框架火热,后续计划分享一些关于vue.js相关的知识。喜欢的朋友,可以关注下博客,更新时间待定!
如果写的文章,对你帮助,记得打赏哦!哈哈...
本文出自段亮博客,如需转载请注明出处。
本文出处:http://www.duanliang920.com/learn/web353.html
Webpack之“多页面开发”最佳实战的更多相关文章
- webpack+react多页面开发(二)-终极架构
webpack4+react16多页面架构 webpack在单页面打包上应用广泛,以create-react-app为首的脚手架众多,单页面打包通常指的是将业务js,css打包到同一个html文件中, ...
- 优化单页面开发环境:webpack与react的运行时打包与热更新
前面两篇文章介绍初步搭建单页面应用的开发环境: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-router实现单页面应用路由 这 ...
- Web前端开发最佳实践(4):在页面中添加必要的meta信息
meta标签放置在HTML页面的head中,主要用于标识网站.其中基本上包含了网站的一些描述信息,例如,简介.作者等.这些信息有助于搜索引擎更准确地识别网页的内容,也有助于第三方工具抓取网站基本信息. ...
- Spring Boot +Vue 项目实战笔记(二):前后端结合测试(登录页面开发)
前言:关于开发环境 每位 Coder 都有自己偏好的开发工具,从大的方面划分主要有文本编辑器流和 IDE 流两种,我有一段时间也喜欢用编辑器(Sublime Text.Vim),但对我来说开发效率确实 ...
- vue2.0 构建单页应用最佳实战
vue2.0 构建单页应用最佳实战 前言 我们将会选择使用一些 vue 周边的库vue-cli, vue-router,vue-resource,vuex 1.使用 vue-cli 创建项目2.使 ...
- web前端开发最佳实践笔记
一.文章开篇 由于最近也比较忙,一方面是忙着公司的事情,另外一方面也是忙着看书和学习,所以没有时间来和大家一起分享知识,现在好了,终于回归博客园的大家庭了,今天我打算来分享一下关于<web前端开 ...
- [转]Android开发最佳实践
——欢迎转载,请注明出处 http://blog.csdn.net/asce1885 ,未经本人同意请勿用于商业用途,谢谢—— 原文链接:https://github.com/futurice/and ...
- webpack 多页应用架构系列实战
阅读目录 1.webpack配置了解 2.webpack CommonsChunkPlugin公共代码剥离 3.了解ProvidePlugin的用途 回到顶部 1.webpack配置了解 webpac ...
- vue2 入门 教程 单页应用最佳实战[*****]
推荐 vue2 入门 教程 -------- 看过其他的,再看作者的,很赞 vue2 入门 教程 单页应用最佳实战 : 具体在 https://github.com/MeCKodo/vue-tuto ...
随机推荐
- Kattis - abc 【水】
题意 给出三个数,然后给出一个顺序,有ABC三个字母构成, A是最大的数字 B是中间的数字 C是最小的数字 根据 ABC的顺序 给出 数字的顺序 思路 先排序一下,然后用 MAP 双向标记一下 AC代 ...
- Linux Shell基础 环境变量
环境变量 环境变量和用户自定义变量最主要的区别在于,环境变量是全局变量,而用户自定义变量是局部变量.用户自定义变量只在当前的 Shell 中生效,而环境变量会在当前 Shell 和这个 Shell 的 ...
- $.queue() 与 $.dequeue() -- 队列
JQuery 运用队列为动画模块服务,但好像它应该有更多用处,我觉得的,那试试就知道咯. 简单的来讲,它就是形成队列和出列, 也就因此可以进行很有规律的回调和延时了呀(暂停感觉有难度),当然这就是后面 ...
- 原生javasxript获取浏览器的滚动距离和可视窗口的高度
原生javasxript获取浏览器的滚动距离和可视窗口的高度 //封装兼容性方法获取滚动的距离 function getScrollOffset(){ if(window.pageXOffset){ ...
- SpringBoot Mybatis 入门
Mybatis for Java API官方文档:http://www.mybatis.org/mybatis-3/zh/java-api.html Mybatis语法介绍 @Select 查询,所有 ...
- 【P2405】方格取数问题加强版(费用流)
考虑如何建图.还是老样子先拆点,然后把每两个点之间连接两条边,一条流量为1,费用为-点权,处理是否走这个点.一条流量无限,没有费用,因为哪怕一个点选过了,它的地方还是可以重复走过去的. 然后把经由一个 ...
- springcloud-声明式调用服务Feign
springcloud项目例子:链接:https://pan.baidu.com/s/1O1PKrdvrq5c8sQUb7dQ5Pg 密码:ynir 作用: 基于Netflix Feign整合了Rib ...
- JavaScript -- 练习 window 流氓广告
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 初探MyBatis之HelloWorld(二)
二.不使用 XML 构建 SqlSessionFactory 不使用xml构建SqlSessionFactory的话,就要用java代码来连接数据库.我这里直接new DataSorce()接口实现g ...
- CDN,内容分发网络。
CDN,内容分发网络. 就近获取内容,提高用户访问网站响应速度. 广州的用户,访问广州的节点.北京的用户,访问北京的节点. 图片CDN,提高图片访问,方便数据迁移. DNS,域名系统.处理域名和IP地 ...