1、css-loader 模块化css文件,让webpack可以处理css文件,style-loader 在html 中插入style标签并把css代码插入到style标签中。写法是: style-loader!css_loader,有的需要加浏览器前缀,有时候需要处理css文件中import进来的css文件这个时候需要以如下方式写loader
{
test: /.css$/,
loader: 'style-loader!css-loader?importLoaders=1!postcss-loader'
}
备注:importLoaders=1用来处理在css中import样式文件[css]时不能转换兼容代码的问题
{
test: /.less$/,
loader: 'style!css!postcss!less'
}
{
test: /.scss$/,
loader: 'style!css!postcss!sass'
}
2、chunkhash 只有在文件发生变化的时候才生产hash,hash 是文件打包的hash也就是说每打包一次都会生成一次hash,所以,文件名称引用时时候chunkhash,因为文件改变是才生产hash是很有用的。
3、htmlwebpackplugin 这个webpack插件可以在html中使用模板语言,重要的是可以改变已经产生hash的js链接
4、优化打包速度,可以在loader里面用exclude排除范围,exclude指定包含的范围。[include作用比exclude作用大]
5、path.resolve(__dirname, 'app/src')生成绝对路径,__dirname是当前脚本运行路径
6、图片文件如果要打包,且图片文件在src中,这个时候引入方式为
<img src="${require('../../assets/bg.png')}"></img>
{
test: /.(png|jpg|gif|svg)$/i,
loaders: ['url-loader?limit=1000&name=assets/[name]-[hash:5].[ext]', // 参数的意思是图片文件存在assets文件下且小于1000kb的就直接用base64转换成image:data
'image-webpack' // 压缩图片
]
}
7、node中--save-dev 和 --save的写法区别
npm install vue-cli (安装vue-cli ) 有的时候有看到其它两种写法: --save-dev 和 --save的写法。这两个有一定的区别,我们都知道package.json 中有一个 “dependencies” 和 “devDependencies” 的。dependencies 是用在开发完上线模式的,就是有些东西你上线以后还需要依赖的,比如juqery , 我们这里的vue 和 babel-runtime(Babel 转码器 可以将ES6 转为ES5 ), 而devDependencies 则是在开发模式执行的,比如我们如果需要安装一个node-sass 等等。有的时候看到package.json中安装的模块版本号前面有一个波浪线。例如: ~1.2.3 这里表示安装1.2.x以上版本。但是不安装1.3以上。
详细信息见 http://www.cnblogs.com/PeunZhang/p/5553574.html#npm-install
备注:注意一个细节问题,使用 npm install x -S 或者 npm install x --save 安装的插件会在package.json文件中的depedencies 字段中出现 相应的依赖,这就意味着打包之后的文件中包含这些文件,因为这些依赖是生产环境的依赖,而 npm install x --D 或者 npm install x --save-dev 安装的插件会在package.json 文件中的devDependencies 中出现相应的依赖,这些依赖在打包的时候不会被打包到静态文件中。 所以安装插件时注意一下生产环境和开发环境的插件安装方式
8、devmiddleware 将编译之后的文件都放到内存中,适用于开发环境使用
9、hotmiddleware 热更新修改之后的文件
10、打包编译成功之后浏览器更新,这段代码需要在每次更新之后打包更新页面内容
client.js
/* eslint-disable */
require('eventsource-polyfill')
var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
hotClient.subscribe(function (event) {
if (event.action === 'reload') {
window.location.reload()
}
})
dev-server.js
var express = require('express')
var app = express()
var path = require('path')
var webpack = require('webpack')
var webpackConfig = require('./webpack.config.js')
var opn = require('opn')
Object.keys(webpackConfig.entry).forEach(function (name) {
webpackConfig.entry[name] = ['./dev-client'].concat(webpackConfig.entry[name])
})
var compiler = webpack(webpackConfig)
var devMiddleware = require('webpack-dev-middleware')(compiler, {
publicPath: '/',
quiet: true
})
var hotMiddleware = require('webpack-hot-middleware')(compiler, {
log: () => {}
})
compiler.plugin('compilation', function (compilation) {
compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
hotMiddleware.publish({ action: 'reload' })
cb()
})
})
var staticPath = path.posix.join('/', 'src')
app.use(staticPath, express.static('./src'))
app.use(express.static('dist'))
// app.get('/', function (req, res) {
// // res.sendFile(__dirname+'/index.html');
// })
app.use(require('connect-history-api-fallback')())
app.use(devMiddleware)
app.use(hotMiddleware)
var _resolve
var readyPromise = new Promise(resolve => {
_resolve = resolve
})
app.listen(3033, () => {
console.log(`listen at http://localhost:3033`)
opn('http://localhost:3033')
_resolve()
})
devMiddleware.waitUntilValid(function () {
console.log('> Listening at 3033
')
})
module.exports = {
ready: readyPromise,
close: () => {
server.close()
}
}
webpack.config.js
let webpack = require('webpack')
var path = require('path')
var htmlwebpackplugin = require('html-webpack-plugin')
var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
module.exports = {
entry: {app: './src/main.js'},
output: {
path: path.resolve(__dirname, './dist'),
filename: 'js/[name]-[hash].js'
},
module: {
loaders: [{
test: /.js$/,
loader: 'babel-loader',
include: path.resolve(__dirname, 'src'),
exclude: path.resolve(__dirname, 'node_modules'),
},
{
test: /.vue$/,
loader: 'vue-loader',
include: path.resolve(__dirname, 'src'),
exclude: path.resolve(__dirname, 'node_modules')
},
{
test: /.js$/,
loader: 'babel-loader',
include: path.resolve(__dirname, 'src'),
exclude: path.resolve(__dirname, 'node_modules')
},
{
test: /.less$/,
include: '/src',
loader: 'style!css!postcss!less',
include: path.resolve(__dirname, 'src'),
exclude: path.resolve(__dirname, 'node_modules')
}]
},
// cheap-module-eval-source-map is faster for development
devtool: '#cheap-module-eval-source-map',
plugins: [
// ...
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"development"' // production
}
}),
new htmlwebpackplugin({
// filename: '[name]-[hash].html',
filename: 'index.html',
template: 'index.html',
inject: true
}),
new webpack.HotModuleReplacementPlugin(), // 热替换,也就是更新的地方会被替换,没有更新的地方不会替换
new webpack.NoEmitOnErrorsPlugin(),
new FriendlyErrorsPlugin() // 控制台热替换
]
}
11、css module
