webpack配置的最佳实践分享

前端之家收集整理的这篇文章主要介绍了webpack配置的最佳实践分享前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文主要介绍了关于webpack配置的最佳实践,本文分享的实践具有以下的优势:

  • 使用happypack提升打包速度。
  • 使用MD5 hash可以生成文件版本,进行版本控制
  • 在非单页面的系统中支持多个入口的配置
  • 模板中可以利用htmlplugin输出一些配置性的信息
  • 支持devserver,支持本地json数据的mock

一、webpack最佳实践中的需求

1.热加载

2.语法校验

3.js打包

4.模板打包

二、解决方

1.webpack.config.json

页面文件映射 function getHtmlPluginArr() { var data = JSON.parse(fs.readFileSync('entryconf.json','utf-8')); var pageList = data.pageList; var resultObj = { "pluginArr": [],"entryObj": {} }; for (var index = 0; index < pageList.length; index++) { var element = pageList[index]; var entry = element.entry; //通过对app.json中src的路径截取获得分发路径 var filename = (function () { var filenameStr = entry.split("./app/page/")[1]; return filenameStr.substr(0,filenameStr.lastIndexOf(".")); })(); var title = element.title; var extra = element.extra; resultObj.entryObj[filename] = entry; //利用路径一部分来进行HtmlwebpackPlugin的chunks resultObj.pluginArr.push( new HtmlwebpackPlugin({ chunks: [filename],//当前页面js title: title,extra: extra,//包含页面额外的配置信息 template: "app/" + "template.ejs",filename: 'views/'+filename + '.ejs',chunksSortMode: "dependency"//按chunks的顺序对js进行引入 }) ); //HappyPack,loader多进程去处理文件 resultObj.pluginArr.push( new HappyPack({ id: 'html' }),new HappyPack({ id: 'css' }),new HappyPack({ id: 'js' }),new HappyPack({ id: 'tpl' }) ); } return resultObj; } var appJsonObj = getHtmlPluginArr(); /**通用配置 */ var commonConfig = { entry: appJsonObj.entryObj,module: { loaders: [ { test: /\.html$/,loader: "html?minimize=false",happy: {id: "html"} },{ test: /\.json$/,loader: "json" },{ test: /\.scss|\.css$/,loaders: ["style","css","sass"],happy: {id: "css"} },{ test: /\.(?:jpg|gif|png)$/,loader: 'url?limit=10240&name=images/[name]-[hash:10].[ext]' },{ test: /\.handlebars/,loader: "handlebars",query: { helperDirs: [APP_PATH + "/helper"] },happy: {id: "tpl"} },{ test: /\.js$|\.jsx$/,exclude: /(node_modules|bower_components)/,loader: 'babel',query: { presets: ['es2015'] },happy: {id: "js"} },] },output: { path: BUILD_PATH,filename: "js/[name].js" },externals: { "jquery": "jQuery" },//配置短路径引用 resolve: { extensions: ['','.js','.json','.scss','.vue'],alias: { vue : 'vue/dist/vue.js' } },plugins: appJsonObj.pluginArr,cache: true } module.exports = merge(commonConfig,{ output: { publicPath: '/',path: BUILD_PATH,filename: "js/[name]-[chunkhash:10].js" },plugins: [ new webpack.optimize.UglifyJsPlugin({ minimize: true }),new WebpackMd5Hash() ] });

2.模板文件的配置:

<Meta charset="UTF-8"> <%= htmlWebpackPlugin.options.title || '上单'%>
<% if (htmlWebpackPlugin.options.extra&&htmlWebpackPlugin.options.extra.js) {%> <% for(var i = 0;i < htmlWebpackPlugin.options.extra.js.length;i++){ %>

3.webpack.dev.config.json配置

页面文件映射 function getHtmlPluginArr() { var data = JSON.parse(fs.readFileSync('app/entries.json',"entryObj": {} }; for (var index = 0; index < pageList.length; index++) { var element = pageList[index]; var src = element.entry; //通过对app.json中src的路径截取获得分发路径 var dist = (function() { var s1 = src.split("./app/entries/")[1]; var s2 = s1.substr(0,s1.lastIndexOf("/")); return s2; })(); var title = element.title; var extra = element.extra; resultObj.entryObj[dist] = src; //利用路径一部分来进行HtmlwebpackPlugin的chunks resultObj.pluginArr.push( new HtmlwebpackPlugin({ chunks: [dist],//当前页面js title: title,//包含页面额外的配置信息 template: "app/" + "template.ejs",filename: dist + '.html',chunksSortMode: "dependency" //按chunks的顺序对js进行引入 }) ); } return resultObj; } var appJsonObj = getHtmlPluginArr(); /**通用配置 */ var commonConfig = { entry: appJsonObj.entryObj,loader: "html?minimize=false" },"sass"] },loader: 'url?limit=10240&name=../images/[name]-[hash:10].[ext]' },loader: "handlebars" },{ test: /\.js$/,query: { presets: ['es2015','stage-3','react'] } },{ test: /\.jsx$/,query: { presets: ['react','es2015']} } ] },//配置短路径引用 resolve: { alias: { module: path.resolve(APP_PATH,'module'),service: path.resolve(APP_PATH,"services"),component: path.resolve(APP_PATH,"components"),entries: path.resolve(APP_PATH,"entries"),routes: path.resolve(APP_PATH,"routes"),node_modules: path.resolve(ROOT_PATH,'node_modules') },extensions: ['','.jsx'] },devtool: "cheap-source-map",cache: true } //webpack-dev-server 提供的是内存级别的server,不会生成build的文件夹 //访问路径直接参照build下的路径 如http://127.0.0.1:8080/shop/updateShop.html module.exports = merge(commonConfig,{ devServer: { hot: true,inline: true,progress: true,host: process.env.HOST,port: "8808",proxy: { '/api/getLeftBar': { target: 'http://127.0.0.1:8808/mock',//dev secure: false },'/api/getIndexData': { target: 'http://127.0.0.1:8808/mock','/api/getblogs': { target: 'http://127.0.0.1:8808/mock','/panda/*': { target: 'http://10.4.233.139:8411/',//转发至本地mock '/page3/*': { target: 'http://127.0.0.1:8808',secure: false } } },plugins: [ new webpack.HotModuleReplacementPlugin(),new OpenBrowserPlugin({ url: 'http://127.0.0.1:8808/test.html' }) ] });

总结

以上就是关于webpack最佳配置的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程之家的支持

猜你在找的JavaScript相关文章