注:
这个博客主要是参考这个博主的:http://www.jianshu.com/p/9423a7f04d31
但是这个博主用的webpack的版本是1.15.0,按照他的指导配置下去在配置webpack dev-server的时候出现错误,有好多插件的版本不兼容,所以我换成了最新的webpack版本3.10.0,按照我下面给出的版本号安装是没问题的。(其中“extract-text-webpack-plugin”插件安装的时候要是按默认安装,即不加版本号,安装的是最新的,但是这会和webpack dev-server发生不兼容,所以我换成了带版本号的,具体看下面)。要是安装的时候有版本不兼容的情况要更新下npm。命令:npm update -g。我的npm版本是:5.6.0
项目准备工具:
(1)NodeJs版本是V4.4.7,作为使用webpack的运行环境.
(2)Git我是用的windows下的Git,以后的项目是在Git Brash Here界面进行的操作.
Git远程仓库的建立
如果你是从头开始一个新项目的话
在Github建立远程仓库
在本地新建项目的结构
git初始化
git init
//在Github上添加了你的主机公钥
git remote add origin ssh address
.DS_Store
/node_modules/
/dist
.gitignore配置的作用:在向远程服务器推送的时候忽略这些项。
git add .
git commit -m "something"
git push -u origin master
当然,我们应该是在分支中完成项目的
git checkout -b dev
Git太具体的配置我在这里就不详细说了,不清楚的可以去网上找找,有很多。
项目脚手架搭建
npm init
2 webpack
webpack全局安装:npm install webpack -g
webpack本地安装:npm install webpack –save-dev ,我这默认安装没有加版本号(webpack版本为3.10.0)
3. webpack.config.js
当然,你不可能做一个项目采用命令行的方式打包吧
entry js的入口文件
externals 外部依赖的声明
output 目标文件
resolve 配置别名
module 各种文件,各种loader
plugins 插件
对脚本处理的一些问题
js用什么loader加载?
使用webpack自带的js加载方式
var config = {
entry: {
'index':['./src/page/index/index.js'],
'login':['./src/page/login/index.js']
},
output: {
path: './dist',
filename: '[name].js' //需要注意的是多个入口文件如果不采用这种方式,入口文件会被依次覆盖
}
};
module.exports = config
var config = {
entry: {
'index':['./src/page/index/index.js'],
'login':['./src/page/login/index.js']
},
output: {
path: './dist',
filename: '/js/[name].js' //filename是支持路径的,我们可以在这里去指定路径
}
};
module.exports = config
'use strict';
var $ = require('jquery');
console.log('hello index');
$('body').html('HELLO INDEX');
但是这种方法不好的地方在于我每个文件几乎我都需要引入jquery,这就很麻烦了,麻烦的事我们都不喜欢做..
<script src="https://cdn.bootcss.com/jquery/1.11.3/jquery.min.js">script>
恩,这样就解决了,这里用的jquery1.11.3 ,但是,我们想用模块化的方式引入jquery呢?
//index.js
'use strict';
console.log('hello index');
var $$ = require('jquery'); //没有在npm安装jquery
$$('body').html('index hello ~~~~~~');
var config = {
entry: {
'index':['./src/page/index/index.js'],
'login':['./src/page/login/index.js']
},
output: {
path: './dist',
filename: '/js/[name].js'
},
externals:{
'jquery':'window.jQuery' //引入外部的变量或模块加载进来
}
};
module.exports = config
var webpack = require('webpack');
var config = {
entry: {
'index':['./src/page/index/index.js'],
'login':['./src/page/login/index.js']
},
output: {
path: './dist',
filename: '/js/[name].js'
},
externals:{
'jquery':'window.jQuery'
},
plugins:[
new webpack.optimize.CommonsChunkPlugin({ //介个就拷贝吧,谁记介个
name:'commons', //存的文件名,commons是默认的
filename:'js/base.js' //最后输出的文件名,filename都是基于output的path
//index和login都引入了相同的模块,因此,它会将这个通用的模块引入进base.js中
})
]
};
module.exports = config
但是我每个文件都引入相同模块我还要写一句require(),我不想写…
var webpack = require('webpack');
var config = {
entry: {
'common':['./src/page/common/index.js'],
'index':['./src/page/index/index.js'],
'login':['./src/page/login/index.js']
},
output: {
path: './dist',
filename: '/js/[name].js'
},
externals:{
'jquery':'window.jQuery'
},
plugins:[
new webpack.optimize.CommonsChunkPlugin({
name:'common', //这个common和entry的common对应,否则common会生成common.js而不是base.js
filename:'js/base.js'
})
]
};
module.exports = config
对样式处理的一些问题
npm install css-loader style-loader --save-dev
css-loader版本为:0.28.7
style-loader版本为:0.19.1
js引入css文件
//index.js
'use strict';
console.log('hello index');
require('./index.css');
require('../module.js');
//webpack.config.js
var webpack = require('webpack');
var config = {
entry: {
'common':['./src/page/common/index.js'],
'index':['./src/page/index/index.js'],
'login':['./src/page/login/index.js']
},
output: {
path: './dist',
filename: '/js/[name].js'
},
externals:{
'jquery':'window.jQuery'
},
module:{
loaders:[
{test:/\.css$/,loader:"style-loader!css-loader"}
//从右往左,先执行css-loader再执行style-loader
]
},
plugins:[
new webpack.optimize.CommonsChunkPlugin({
name:'common', base.js
filename:'js/base.js'
})
]
};
module.exports = config
npm install extract-text-webpack-plugin --save-dev
extract-text-webpack-plugin版本是:2.1.2
要是按照上面的执行安装的3.XX的版本,我在安装之后在安装webpack dev-server时候出现错误了,所以我安装的是2.1.2版本,是没问题的,如下:
npm install extract-text-webpack-plugin@2.1.2 --save-dev
var webpack = require('webpack');
var ExtractTextPlugin = require('extract-text-webpack-plugin'); //1.引入
var config = {
entry: {
'common':['./src/page/common/index.js'],
'index':['./src/page/index/index.js'],
'login':['./src/page/login/index.js']
},
output: {
path: './dist',
filename: '/js/[name].js'
},
externals:{
'jquery':'window.jQuery'
},
module:{
loaders:[
{ test: /\.css$/, loader: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader' })},//2.做一次转化
]
},
plugins:[
new webpack.optimize.CommonsChunkPlugin({
name:'common',
filename:'js/base.js'
}),
new ExtractTextPlugin("css/[name].css") //3.添加dist路径
]
};
module.exports = config
对html模板处理的问题
html-webpack-plugin
我们为什么要进行html模板处理呢?如果现在我们上线了,后来再改,你的一些引入的文件是要加版本号的,但是有几十个页面,每个页面都要加版本号,那不得急死…而且html文件是在src目录下,并不在dist目录下,我们打包后,src是不管的.因此,我们要对我们的html进行一些配置
插件链接: https://webpack.js.org/plugins/html-webpack-plugin/
参数:
title: title值用于生成的HTML文档。
filename: 将生成的HTML写入到该文件中。默认写入到index.html中。你也可以在这儿指定子目录 (eg: assets/admin.html)。
template: Webpack require path 到 template中。 详情查阅 docs
inject:true | ‘head’ | ‘body’ | false添加所有的静态资源(assets)到模板文件或templateContent 。当传入true或body时,所有javascript资源将被放置到body 元素的底部。 当传入head时, 所有的脚本将被放置到head元素中。
favicon: 添加指定的favicon path到输出的html文件。
minify:{…} | false传入一个html-minifier 对象选项来压缩输出的html文件。
hash:true | false如果值为true,就添加一个唯一的webpack compilation hash给所有已included的 scripts 和 CSS 文件。这对缓存清除(cache busting)十分有用。
cache:true | false如果为true (默认),只要文件被更改了就emit(发表)文件。
showErrors:true | false如果为true (默认),详细的错误信息将被写入到HTML页面。
chunks:允许你只添加某些chunks (e.g. only the unit-test chunk)
chunksSortMode: 在chunks被include到html文件中以前,允许你控制chunks 应当如何被排序。允许的值:’none’ | ‘auto’ | ‘dependency’ | {function}默认值:’auto’。
excludeChunks: 允许你跳过某些chunks (e.g. don’t add the unit-test chunk)
xhtml:true | false如果为true, 将 link 标签渲染为自闭合标签, XHTML compliant。 默认是 false。
参数参考自: 前端xiyoki链接:http://www.jianshu.com/p/2c849a445a91
流程
npm install html-webpack-plugin --save-dev
html-webpack-plugin版本:2.30.1
var webpack = require('webpack');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
var htmlWebpackPlugin = require('html-webpack-plugin'); //1.引入
//获取html-webpack-plugin获取参数的方法
var getHtmlConfig = function(name){
return {
template:'./src/view/' + name +'.html',
filename:'view/' + name + '.html',
inject:true,
hash:true,
chunks:['common',name]
}
}
var config = {
entry: {
'common':['./src/page/common/index.js'],
'index':['./src/page/index/index.js'],
'login':['./src/page/login/index.js']
},
output: {
path: './dist',
filename: 'js/[name].js'
},
externals:{
'jquery':'window.jQuery'
},
module:{
loaders:[
{test:/\.css$/,loader:ExtractTextPlugin.extract("style-loader","css-loader")}
]
},
plugins:[
//独立通用模块js/base.js
new webpack.optimize.CommonsChunkPlugin({
name:'common',
filename:'js/base.js'
}),
//把css单独打包到文件里
new ExtractTextPlugin("css/[name].css"),
//html模板的处理
new htmlWebpackPlugin(getHtmlConfig('index')),
new htmlWebpackPlugin(getHtmlConfig('login'))
]
};
module.exports = config
ok,我们的自动打包html模板就大功告成了.但是我们每次打包的时候都需要有个初始的html文件,我们需要每个文件都加上那么一句jquery的引用好麻烦啊,由于我们后面需要这个html-loader作为中介
npm install html-loader --save-dev
html-loader版本:0.5.1
嗯,我们把head抽离出来
//html-head.html
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Documenttitle>
head>
//index.html
<html lang="en">
<%= require('html-loader!./layout/html-head.html') %>
<body>
<script src="https://cdn.bootcss.com/jquery/1.11.3/jquery.min.js">script>
body>
html>
对图片处理的问题
npm install url-loader --save-dev
html-loader版本:0.6.2
此种情况会将你的图片转为base64格式存在css文件中
...
module:{
loaders:[
{test:/\.css$/,loader:ExtractTextPlugin.extract("style-loader","css-loader")},
{test:/\.(gif|png|jpg)\??.*$/,loader:'url-loader'},
]
},
...
当然好处是你减少请求了,但是大的文件我们还是应该放一个地方从css文件中拿出来
npm install file-loader --save-dev
file-loader版本:1.1.6
module:{
loaders:[
{test:/\.css$/,loader:ExtractTextPlugin.extract("style-loader","css-loader")},
{test:/\.(gif|png|jpg|jpeg)\??.*$/,loader:'file-loader?limit=1000&name=resource/[name].[ext]'}
]
},
对icon-font处理的问题
module:{
loaders:[
{test:/\.css$/,loader:ExtractTextPlugin.extract("style-loader","css-loader")},
{test:/\.(gif|png|jpg|woff|svg|eot|ttf)\??.*$/,loader:'file-loader?limit=1000&name=resource/[name].[ext]'}
//只需要在这里加入扩展名
]
},
webpack-dev-server的安装
npm install webpack-dev-server --save-dev
webpack-dev-server版本:2.9.7
为了能够使用命令要在全局安装webpack-dev-server
npm install webpack-dev-server -g
执行webpack-dev-server,发现我们使用的是它的iframe方式,这种方式不利于我们做调试,因此我们采取另外一种方式
首先,我们要将webpack-dev-server的代理放置在页面上,而common这个公共模块是所有页面都有的,因此:
//webpack.config.js
...
entry: {
'common':['./src/page/common/index.js','webpack-dev-server/client?http://localhost:8088/'], //设置代理
'index':['./src/page/index/index.js'],
'login':['./src/page/login/index.js']
},
...
执行命令:
webpack-dev-server --inline --port 8088
但是由于webpack-dev-server的路径是’/’,我们的路径是’../’,因此我们要指定一下页面访问的路径
//webapck.config.js
...
output: {
path: './dist',
publicPath:'/dist', //页面的访问路径
filename: '/js/[name].js'
},
...
但是我们webpack-dev-server的这个模块不是我们线上的时候需要的,因此进行如下配置
//webapck.config.js
...
//环境变量配置 dev / online
var WEBPACK_ENV = process.env.WEBPACK_ENV || 'dev'
console.log(WEBPACK_ENV)
//做判断
if(WEBPACK_ENV === 'dev'){
config.entry.common.push('webpack-dev-server/client?http://localhost:8088/')
}
entry: {
'common':['./src/page/common/index.js'],
'index':['./src/page/index/index.js'],
'login':['./src/page/login/index.js']
},
...
最后别忘了删除common中的webpack-dev-server配置,就是下面common在变成如下的样子:
‘common’:[‘./src/page/common/index.js’],
...
entry: {
'common':['./src/page/common/index.js','webpack-dev-server/client?http://localhost:8088/'], //设置代理
'index':['./src/page/index/index.js'],
'login':['./src/page/login/index.js']
},
...
此时,执行命令
WEBPACK_ENV=dev webpack-dev-server --inline --port 8088
OK,我们的webpack-dev-server基本上都配置好了,下面我们来优化一下我们的npm命令
//package.json
...
"scripts": {
"dev" : "WEBPACK_ENV=dev webpack-dev-server --inline --port 8088",
"dev_win" : "set WEBPACK_ENV=dev && webpack-dev-server --inline --port 8088",
"dist": "WEBPACK_ENV=online webpack -p",
"dist_win": "set WEBPACK_ENV=online && webpack -p"
},
...
执行:
Linux和Mac下执行下面的命令:
npm run dev
windows下执行下面的命令:
npm run dev_win