前情提要
上一篇文章介绍了目前前端比较流行的各种编辑器,以及各种流行的打包方式,最后给了一个Gulp的例子,这个例子还是14年的时候写的,还有一些可以优化的空间,就不讨论了,这篇文章主要讲目前火热的打包构建方式–Webpack的使用方式。
主菜–没有开胃汤
其实Webpack的入门指导文章非常多,配置方式也各有各样,这里我推荐题叶大神的入门级指南–Webpack 入门指迷,如果不知道Webpack是什么或者不是很清楚各项配置含义的开发者,可以看此文章扫扫盲。毕竟我这篇文章并不是特别基础。
一、base.js
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 |
var path = require('path') var baseConfig = { resolve: { extensions: ['', '.js'], fallback: [path.join(__dirname, '../node_modules')], alias: { 'src': path.resolve(__dirname, '../src'), 'assets': path.resolve(__dirname, '../src/assets'), 'components': path.resolve(__dirname, '../src/components') } }, module: { loaders: [{ test: /\.js$/, loader: 'babel', exclude: /node_modules/ }, { test: /\.(png|jpe?g|gif|svg|woff2?|eot|ttf|otf)(\?.*)?$/, loader: 'url?limit=8192&context=client&name=[path][name].[hash:7].[ext]' }, { test: /\.css$/, loader: 'style!css!autoprefixer', }, { test: /\.scss$/, loader: 'style!css!autoprefixer!sass' }] } }; module.exports = baseConfig; |
解读下这个基本配置:
1、resolve 解析模块依赖的时候,受影响的配置项。
- extensions 决定了哪些文件后缀在引用的时候可以省略点,Webpack帮助你补全名称。
- fallback 当webpack在 root(默认当前文件夹,配置时要绝对路径) 和 modulesDirectories(默认当前文件夹,相对路径)配置下面找不到相关modules,去哪个文件夹下找modules
- alias 这个大家应该比较熟悉,requirejs之类的都有,就是别名,帮助你快速指向文件路径,少写不少代码,而且不用关心层级关系,需要注意的是:在scss之类的css预编译中引用要加上~,以便于让loader识别是别名引用路径。
2、module 解析不同文件使用哪些loader,这个比较简单,很多文章都有,就不多说了,注意的是,这里的scss可以换成你自己的预编译器,例如:sass、less、stylus等,或者直接用postcss都行,当然还可以用一种通用方法,后面补上。
二、开发环境配置–config
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 |
var webpack = require('webpack'); var path = require('path') var merge = require('webpack-merge') var baseConfig = require('./webpack.base') var getEntries = require('./getEntries') var hotMiddlewareScript = 'webpack-hot-middleware/client?reload=true'; var assetsInsert = require('./assetsInsert') module.exports = merge(baseConfig, { entry: getEntries(hotMiddlewareScript), devtool: '#eval-source-map', output: { filename: './[name].[hash].js', path: path.resolve('./dist'), publicPath:'./dist' }, plugins: [ new webpack.DefinePlugin({ 'process.env': { NODE_ENV: '"development"' } }), new webpack.optimize.OccurenceOrderPlugin(), new webpack.HotModuleReplacementPlugin(), new webpack.NoErrorsPlugin(), new assetsInsert() ] }) |
说说这个配置中的一些难点:
1、getEntries 是用来配置入口文件,一般很多人是自己手写,或者SPA页面,只有一个入口, 很容易就写出来,但是公司中,很多情况,是需要多入口,也就是多路由的Url,这个时候入口的配置就比较麻烦,我这里是放单独一个文件里面配置,我们公司是靠规定来执行,也就是一个文件夹所有的main.js都认为是入口文件,其他都忽略。
主菜–没有开胃汤
其实Webpack的入门指导文章非常多,配置方式也各有各样,这里我推荐题叶大神的入门级指南–Webpack 入门指迷,如果不知道Webpack是什么或者不是很清楚各项配置含义的开发者,可以看此文章扫扫盲。毕竟我这篇文章并不是特别基础。
一、base.js
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 |
var path = require('path') var baseConfig = { resolve: { extensions: ['', '.js'], fallback: [path.join(__dirname, '../node_modules')], alias: { 'src': path.resolve(__dirname, '../src'), 'assets': path.resolve(__dirname, '../src/assets'), 'components': path.resolve(__dirname, '../src/components') } }, module: { loaders: [{ test: /\.js$/, loader: 'babel', exclude: /node_modules/ }, { test: /\.(png|jpe?g|gif|svg|woff2?|eot|ttf|otf)(\?.*)?$/, loader: 'url?limit=8192&context=client&name=[path][name].[hash:7].[ext]' }, { test: /\.css$/, loader: 'style!css!autoprefixer', }, { test: /\.scss$/, loader: 'style!css!autoprefixer!sass' }] } }; module.exports = baseConfig; |
解读下这个基本配置:
1、resolve 解析模块依赖的时候,受影响的配置项。
- extensions 决定了哪些文件后缀在引用的时候可以省略点,Webpack帮助你补全名称。
- fallback 当webpack在 root(默认当前文件夹,配置时要绝对路径) 和 modulesDirectories(默认当前文件夹,相对路径)配置下面找不到相关modules,去哪个文件夹下找modules
- alias 这个大家应该比较熟悉,requirejs之类的都有,就是别名,帮助你快速指向文件路径,少写不少代码,而且不用关心层级关系,需要注意的是:在scss之类的css预编译中引用要加上~,以便于让loader识别是别名引用路径。
2、module 解析不同文件使用哪些loader,这个比较简单,很多文章都有,就不多说了,注意的是,这里的scss可以换成你自己的预编译器,例如:sass、less、stylus等,或者直接用postcss都行,当然还可以用一种通用方法,后面补上。
二、开发环境配置–config
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 |
var webpack = require('webpack'); var path = require('path') var merge = require('webpack-merge') var baseConfig = require('./webpack.base') var getEntries = require('./getEntries') var hotMiddlewareScript = 'webpack-hot-middleware/client?reload=true'; var assetsInsert = require('./assetsInsert') module.exports = merge(baseConfig, { entry: getEntries(hotMiddlewareScript), devtool: '#eval-source-map', output: { filename: './[name].[hash].js', path: path.resolve('./dist'), publicPath:'./dist' }, plugins: [ new webpack.DefinePlugin({ 'process.env': { NODE_ENV: '"development"' } }), new webpack.optimize.OccurenceOrderPlugin(), new webpack.HotModuleReplacementPlugin(), new webpack.NoErrorsPlugin(), new assetsInsert() ] |