项目中一些很老的技术需要运用webpack管理,这时候必须使用grunt+webpack 配合使用 。做个笔记,不限多说直接上代码
grunt结合webpack
下面是 Gruntfile.js
1 const path = require('path') 2 const fs = require('fs'); 3 const webpack = require("./webpack.config.js"); 4 const destuglifyls = ['dest/limsStyle/equation.js', 'dest/limsStyle/guidance.js', 'dest/limsStyle/postil.js', 'dest/limsStyle/inject.js', 'dest/limsStyle/designTemp.js']; 5 const srcbabells = ['limsStyle/postil.js', 'limsStyle/equation.js', 'limsStyle/guidance.js', 'limsStyle/inject.js', 'limsStyle/designTemp.js']; 6 const srcjshint = ['src/limsStyle/postil.js', 'src/limsStyle/equation.js', 'src/limsStyle/guidance.js', 'src/limsStyle/inject.js', 'src/limsStyle/designTemp.js']; 7 8 module.exports = function (grunt) { 9 grunt.registerTask('setapi', 'setapi..', function (arg1, arg2) { 10 var RouteMapLibPath = './dest/limsStyle/RouteMapLib-1.1.js'; 11 var editConfigPath = './dest/lib/ueditor1_4_3-utf8-net/config.js'; 12 var data = fs.readFileSync('./dest/limsStyle/config.json'); 13 14 var RouteMapLib = fs.readFileSync(RouteMapLibPath).toString(); 15 var editConfigContent = fs.readFileSync(editConfigPath).toString(); 16 data = JSON.parse(data); 17 if (typeof arg1 != 'undefined') { 18 switch (arg1) { 19 case 'dev': 20 { 21 replaceConfig(data.devconfig) 22 }; 23 break; 24 case 'test': 25 { 26 replaceConfig(data.testconfig) 27 }; 28 break; 29 case 'build': 30 { 31 replaceConfig(data.buildconfig) 32 }; 33 break; 34 } 35 } else { 36 replaceConfig(data.location) 37 } 38 fs.writeFileSync(RouteMapLibPath, RouteMapLib); 39 fs.writeFileSync(editConfigPath, editConfigContent); 40 41 function replaceConfig(d) { 42 RouteMapLib = RouteMapLib.replace('{#ajaxUrl}', d.ajaxUrl); 43 RouteMapLib = RouteMapLib.replace('{#user_token}', d.user_token); 44 RouteMapLib = RouteMapLib.replace('{#ELNEdit}', d.ELNEdit); 45 editConfigContent = editConfigContent.replace('{#server}', d.ajaxUrl.replace('API/', '')); 46 // console.log(RouteMapLib); 47 }; 48 49 }); 50 51 52 grunt.initConfig({ 53 clean: ['/dest'], 54 jshint: { 55 all: srcjshint, 56 options: { 57 jshintrc: '.jshintrc' 58 // globals: { 59 // $: false, 60 // jQuery: false 61 // }, 62 // browser: true, 63 // laxcomma:true, 64 // esversion: 6 65 } 66 }, 67 webpack: { 68 options: { 69 stats: !process.env.NODE_ENV || process.env.NODE_ENV === 'development' 70 }, 71 dev: webpack 72 }, 73 // webpack: { 74 // options: { 75 // stats: !process.env.NODE_ENV || process.env.NODE_ENV === 'development' 76 // }, 77 // prod: webpack, 78 // dev: Object.assign({ 79 // watch: true 80 // }, webpack) 81 // }, 82 watch: { 83 cwd: 'src', 84 files: ['src/**/*.js', 'src/**/*.json', 'src/**/*.html', 'src/limsStyle/*.css', 'src/**/*.less'], 85 tasks: ['webpack:dev','copy:main', 'setapi', 'jshint', 'babel'], 86 options: { 87 reload: true, 88 livereload: 35729 89 } 90 }, 91 uglify: { 92 main: { 93 files: [{ 94 expand: true, 95 src: destuglifyls, 96 // dest: 'dest', 97 sourceMap: true, 98 rename: function (dst, src) { 99 // To keep the source js files and make new files as `*.min.js`: 100 // return dst + '/' + src.replace('.js', '.min.js'); 101 // Or to override to src: 102 return src; 103 } 104 }] 105 }, 106 }, 107 cssmin: { 108 target: { 109 files: [{ 110 expand: true, 111 cwd: 'src/limsStyle', 112 src: ['*.css'], 113 dest: 'dest/limsStyle' 114 }] 115 } 116 }, 117 copy: { 118 processContentExclude: ['othen/**'], 119 main: { 120 expand: true, 121 cwd: 'src', 122 //src: ['**', '!*.sln', '!**lib/diff/**', '!**lib/layer-v3.1.1/**', '!**lib/layerdate/**', '!**.vs/**', '!**lib/bootstrap-3.3.7-dist/**', '!**lib/ueditor1_4_3-utf8-net/third-party/**', '!**lib/ueditor1_4_3-utf8-net/third-party/dialogs/**'], //** 123 src: ['limsStyle/**', 'othen/**', '_temp/**', 'images/**', 'layertemplate/**', 'ElnIndex.html', 'designTemplate.html'], 124 dest: 'dest/', 125 flatten: false, 126 filter: 'isFile' 127 }, 128 all: { 129 expand: true, 130 cwd: 'src', 131 src: ['**'], //** 132 dest: 'dest/', 133 flatten: false, 134 filter: 'isFile' 135 } 136 }, 137 babel: { 138 options: { 139 sourceMap: true, 140 presets: ['babel-preset-es2015'] 141 142 }, 143 dist: { 144 files: [{ 145 expand: true, 146 cwd: 'src/', 147 src: srcbabells, 148 dest: 'dest/' 149 }] 150 } 151 }, 152 connect: { 153 options: { 154 port: 9000, 155 hostname: 'localhost', 156 livereload: 35729 157 }, 158 server: { 159 options: { 160 open: true, 161 base: [ 162 "dest" 163 ] 164 } 165 } 166 }, 167 }); 168 169 grunt.loadNpmTasks('grunt-contrib-uglify'); 170 grunt.loadNpmTasks('grunt-contrib-jshint'); 171 grunt.loadNpmTasks('grunt-contrib-copy'); 172 grunt.loadNpmTasks('grunt-contrib-clean'); 173 grunt.loadNpmTasks('grunt-contrib-watch'); 174 grunt.loadNpmTasks('grunt-contrib-connect'); 175 grunt.loadNpmTasks('grunt-babel'); 176 grunt.loadNpmTasks('grunt-contrib-cssmin'); 177 grunt.loadNpmTasks('grunt-webpack'); 178 // grunt.registerTask('clean', ['clean:release', 'copy:all']); 179 180 181 grunt.registerTask('default', ['copy:main', 'webpack:dev', 'babel', 'cssmin', 'uglify', 'setapi', 'connect', 'watch']); //'uglify', 182 grunt.registerTask('dev', ['copy:all', 'babel', 'cssmin', 'uglify', 'setapi:dev']) 183 grunt.registerTask('test', ['copy:all', 'babel', 'cssmin', 'uglify', 'setapi:test']); 184 grunt.registerTask('build', ['copy:all', 'babel', 'cssmin', 'uglify', 'setapi:build']); 185 };
下面是 webpack.config.js文件夹
1 const path = require('path') 2 const webpack = require('webpack') 3 const HtmlWebpackPlugin = require('html-webpack-plugin') 4 const loaderconfig = require('./vue-loader.conf') 5 const VueLoaderPlugin = require('vue-loader/lib/plugin') 6 // const packagejson = require('./package.json') 7 const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin 8 9 module.exports = { 10 entry: './src/vuesrc/main.js', 11 output: { 12 path: path.resolve(__dirname, './src/limsStyle/vuedest/'), 13 filename: 'build.js', 14 chunkFilename: "[id].build.js?[chunkhash]" 15 // vendor: Object.keys(packagejson.dependencies) 16 }, 17 devtool: '#eval-source-map', 18 module: { 19 rules: [{ 20 test: /.vue$/, 21 loader: 'vue-loader', 22 options: loaderconfig 23 }, 24 { 25 test: require.resolve('jquery'), 26 use: [{ 27 loader: 'expose-loader', 28 options: 'jQuery' 29 }, { 30 loader: 'expose-loader', 31 options: '$' 32 }] 33 } 34 ] 35 }, 36 resolve: { 37 extensions: [' ', '.js', '.vue'], 38 // root:"./node_modules", 39 alias: { 40 'vue$': 'vue/dist/vue.js' 41 } 42 }, 43 optimization: { 44 splitChunks: { 45 chunks: 'async', 46 minSize: 10000, 47 maxSize: 0, 48 minChunks: 1, 49 maxAsyncRequests: 5, 50 maxInitialRequests: 3, 51 automaticNameDelimiter: '~', 52 name: true, 53 cacheGroups: { 54 vendors: { 55 test: /[\/]node_modules[\/]/, 56 priority: -10, 57 name: "vendors" 58 }, 59 default: { 60 minChunks: 2, 61 priority: -20, 62 reuseExistingChunk: true 63 } 64 } 65 }, 66 runtimeChunk: { 67 name: entrypoint => `manifest.${entrypoint.name}` 68 } 69 }, 70 plugins: [ 71 new HtmlWebpackPlugin({ 72 filename: 'design.html', 73 template: './src/vuesrc/index.html', 74 inject: true, 75 minify: { 76 removeComments: true, 77 collapseWhitespace: true, 78 removeAttributeQuotes: true 79 // more options: 80 // https://github.com/kangax/html-minifier#options-quick-reference 81 }, 82 // necessary to consistently work with multiple chunks via CommonsChunkPlugin 83 chunksSortMode: 'dependency' 84 }), 85 new VueLoaderPlugin(), 86 // new BundleAnalyzerPlugin() 87 ] 88 }