本文主要介绍了关于webpack配置的最佳实践,本文分享的实践具有以下的优势:
一、webpack最佳实践中的需求
1.热加载
2.语法校验
3.js打包
4.模板打包
二、解决方案
1.webpack.config.json
var path = require('path'); var fs = require('fs'); var exec = require('child_process').exec; var HappyPack = require('happypack'); var merge = require('webpack-merge'); var webpack = require('webpack'); var WebpackMd5Hash = require('webpack-md5-hash'); var HtmlwebpackPlugin = require('html-webpack-plugin'); var ROOT_PATH = path.resolve(__dirname); var APP_PATH = path.resolve(ROOT_PATH, 'app'); var BUILD_PATH = path.resolve(ROOT_PATH, __dirname+'/devserver/public'); //取出页面文件映射 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.模板文件的配置:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> <%= htmlWebpackPlugin.options.title || '上单'%> </title> </head> <body> <div id="main-container"></div> <% if (htmlWebpackPlugin.options.extra&&htmlWebpackPlugin.options.extra.js) {%> <% for(var i = 0;i < htmlWebpackPlugin.options.extra.js.length;i++){ %> <script src="<%= htmlWebpackPlugin.options.extra.js[i] %>"></script> <% } %> <% } %> </body> <script src="https://cdn.bootcss.com/jquery/2.2.3/jquery.min.js"></script> </html>
3.webpack.dev.config.json配置
var path = require('path'); var fs = require('fs'); var merge = require('webpack-merge'); var webpack = require('webpack'); var HtmlwebpackPlugin = require('html-webpack-plugin'); var OpenBrowserPlugin = require('open-browser-webpack-plugin'); var ROOT_PATH = path.resolve(__dirname); var APP_PATH = path.resolve(ROOT_PATH, 'app'); var BUILD_PATH = path.resolve(ROOT_PATH, 'build'); var MODULE_PATH = path.resolve(ROOT_PATH, 'node_modules'); //取出页面文件映射 function getHtmlPluginArr() { var data = JSON.parse(fs.readFileSync('app/entries.json', 'utf-8')); var pageList = data.pageList; var resultObj = { "pluginArr": [], "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, extra: extra,//包含页面额外的配置信息 template: "app/" + "template.ejs", filename: dist + '.html', chunksSortMode: "dependency" //按chunks的顺序对js进行引入 }) ); } return resultObj; } var appJsonObj = getHtmlPluginArr(); /**通用配置 */ var commonConfig = { entry: appJsonObj.entryObj, module: { loaders: [ { test: /\.html$/, loader: "html?minimize=false" }, { test: /\.json$/, loader: "json" }, { test: /\.scss|\.css$/, loaders: ["style", "css", "sass"] }, { test: /\.(?:jpg|gif|png)$/, loader: 'url?limit=10240&name=../images/[name]-[hash:10].[ext]' }, { test: /\.handlebars/, loader: "handlebars" }, { test: /\.js$/, exclude: /(node_modules|bower_components)/, loader: 'babel', query: { presets: ['es2015','stage-3','react'] } }, { test: /\.jsx$/, exclude: /(node_modules|bower_components)/, loader: 'babel', query: { presets: ['react','stage-3','es2015']} } ] }, output: { path: BUILD_PATH, filename: "js/[name].js" }, externals: { "jquery": "jQuery" }, //配置短路径引用 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: ['', '.js', '.jsx'] }, plugins: appJsonObj.pluginArr, 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',//dev secure: false }, '/api/getblogs': { target: 'http://127.0.0.1:8808/mock',//dev secure: false }, '/panda/*': { target: 'http://10.4.233.139:8411/',//dev secure: false }, //转发至本地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最佳配置的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。
本文档旨在汇总和强调用户指南、快速开始文档和示例中的最佳实践。该文档会很活跃并持续更新中。如果你觉得很有用的最佳实践但是本文档中没有包含,欢迎给我们提Pull Request。 通用配置建议 定义配置文件的时候,指定最新的稳定API版本(目前是V1)。 在配置文件push到集群之前应该保存在版本控制系统中。这样当需要的时候能够快速回滚,必要的时候也可以快速的创建集群。 使用YAML格式而不是JSO
例如,对于基于spring的项目,有eureka config(eureka.properties)、zuul config(zuul.properties)、feign config(feign.properties)等。
我希望一些帮助处理一个奇怪的边缘案例与我正在构建的一个分页API。 与许多API一样,这个API分页了大量的结果。如果查询/foos,将得到100个结果(即foo#1-100),以及一个指向/foos?page=2的链接,该链接将返回foo#101-200。 不幸的是,如果在API使用者进行下一个查询之前从数据集中删除了foo#10,/foos?page=2将抵消100并返回foos#102-20
问题内容: 我在应用程序中使用Log4j。放置在classpath中的Jar中。该配置文件正在使用中,并且在大多数情况下都可以正常工作。 但是有时,生成的日志记录语句与配置文件不同。 我的理解是,这是因为属性文件是从类路径中获取的。不管第一个属性文件是什么,都由log4j获取和使用。因此,有时我们得到的日志记录语句与属性文件中配置的语句不同。 如果上述原因属实,那么我认为,我们需要通过以下方式之一
我最感兴趣的是以下属性的最优值: 了解的最优值将是非常好的。连接池设置有大量其他选项,希望得到有关它们对应用程序性能影响的任何建议。
问题内容: 我们构建3层企业解决方案,通常由几个webapp和ejbjar模块组成,这些模块都与数据库通信并具有多个外部集成点。 每个模块通常需要自己的配置,这些配置可以在解决方案的生命周期内进行更改。部署它成为一场噩梦,因为现在我们必须记住18个属性文件以进行复制和配置,还需要设置数据源,队列,内存需求等。 我希望但不能乐观地找到更好的方法。我们考虑/使用过的一些选项,各有其优缺点: 使用多