项目中一些很老的技术需要运用webpack管理,这时候必须使用grunt+webpack 配合使用 。做个笔记,不限多说直接上代码

grunt结合webpack

下面是 Gruntfile.js

 const path = require('path')
const fs = require('fs');
const webpack = require("./webpack.config.js");
const destuglifyls = ['dest/limsStyle/equation.js', 'dest/limsStyle/guidance.js', 'dest/limsStyle/postil.js', 'dest/limsStyle/inject.js', 'dest/limsStyle/designTemp.js'];
const srcbabells = ['limsStyle/postil.js', 'limsStyle/equation.js', 'limsStyle/guidance.js', 'limsStyle/inject.js', 'limsStyle/designTemp.js'];
const srcjshint = ['src/limsStyle/postil.js', 'src/limsStyle/equation.js', 'src/limsStyle/guidance.js', 'src/limsStyle/inject.js', 'src/limsStyle/designTemp.js']; module.exports = function (grunt) {
grunt.registerTask('setapi', 'setapi..', function (arg1, arg2) {
var RouteMapLibPath = './dest/limsStyle/RouteMapLib-1.1.js';
var editConfigPath = './dest/lib/ueditor1_4_3-utf8-net/config.js';
var data = fs.readFileSync('./dest/limsStyle/config.json'); var RouteMapLib = fs.readFileSync(RouteMapLibPath).toString();
var editConfigContent = fs.readFileSync(editConfigPath).toString();
data = JSON.parse(data);
if (typeof arg1 != 'undefined') {
switch (arg1) {
case 'dev':
{
replaceConfig(data.devconfig)
};
break;
case 'test':
{
replaceConfig(data.testconfig)
};
break;
case 'build':
{
replaceConfig(data.buildconfig)
};
break;
}
} else {
replaceConfig(data.location)
}
fs.writeFileSync(RouteMapLibPath, RouteMapLib);
fs.writeFileSync(editConfigPath, editConfigContent); function replaceConfig(d) {
RouteMapLib = RouteMapLib.replace('{#ajaxUrl}', d.ajaxUrl);
RouteMapLib = RouteMapLib.replace('{#user_token}', d.user_token);
RouteMapLib = RouteMapLib.replace('{#ELNEdit}', d.ELNEdit);
editConfigContent = editConfigContent.replace('{#server}', d.ajaxUrl.replace('API/', ''));
// console.log(RouteMapLib);
}; }); grunt.initConfig({
clean: ['/dest'],
jshint: {
all: srcjshint,
options: {
jshintrc: '.jshintrc'
// globals: {
// $: false,
// jQuery: false
// },
// browser: true,
// laxcomma:true,
// esversion: 6
}
},
webpack: {
options: {
stats: !process.env.NODE_ENV || process.env.NODE_ENV === 'development'
},
dev: webpack
},
// webpack: {
// options: {
// stats: !process.env.NODE_ENV || process.env.NODE_ENV === 'development'
// },
// prod: webpack,
// dev: Object.assign({
// watch: true
// }, webpack)
// },
watch: {
cwd: 'src',
files: ['src/**/*.js', 'src/**/*.json', 'src/**/*.html', 'src/limsStyle/*.css', 'src/**/*.less'],
tasks: ['webpack:dev','copy:main', 'setapi', 'jshint', 'babel'],
options: {
reload: true,
livereload: 35729
}
},
uglify: {
main: {
files: [{
expand: true,
src: destuglifyls,
// dest: 'dest',
sourceMap: true,
rename: function (dst, src) {
// To keep the source js files and make new files as `*.min.js`:
// return dst + '/' + src.replace('.js', '.min.js');
// Or to override to src:
return src;
}
}]
},
},
cssmin: {
target: {
files: [{
expand: true,
cwd: 'src/limsStyle',
src: ['*.css'],
dest: 'dest/limsStyle'
}]
}
},
copy: {
processContentExclude: ['othen/**'],
main: {
expand: true,
cwd: 'src',
//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/**'], //**
src: ['limsStyle/**', 'othen/**', '_temp/**', 'images/**', 'layertemplate/**', 'ElnIndex.html', 'designTemplate.html'],
dest: 'dest/',
flatten: false,
filter: 'isFile'
},
all: {
expand: true,
cwd: 'src',
src: ['**'], //**
dest: 'dest/',
flatten: false,
filter: 'isFile'
}
},
babel: {
options: {
sourceMap: true,
presets: ['babel-preset-es2015'] },
dist: {
files: [{
expand: true,
cwd: 'src/',
src: srcbabells,
dest: 'dest/'
}]
}
},
connect: {
options: {
port: 9000,
hostname: 'localhost',
livereload: 35729
},
server: {
options: {
open: true,
base: [
"dest"
]
}
}
},
}); grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-connect');
grunt.loadNpmTasks('grunt-babel');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-webpack');
// grunt.registerTask('clean', ['clean:release', 'copy:all']); grunt.registerTask('default', ['copy:main', 'webpack:dev', 'babel', 'cssmin', 'uglify', 'setapi', 'connect', 'watch']); //'uglify',
grunt.registerTask('dev', ['copy:all', 'babel', 'cssmin', 'uglify', 'setapi:dev'])
grunt.registerTask('test', ['copy:all', 'babel', 'cssmin', 'uglify', 'setapi:test']);
grunt.registerTask('build', ['copy:all', 'babel', 'cssmin', 'uglify', 'setapi:build']);
};

下面是 webpack.config.js文件夹

 const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const loaderconfig = require('./vue-loader.conf')
const VueLoaderPlugin = require('vue-loader/lib/plugin')
// const packagejson = require('./package.json')
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin module.exports = {
entry: './src/vuesrc/main.js',
output: {
path: path.resolve(__dirname, './src/limsStyle/vuedest/'),
filename: 'build.js',
chunkFilename: "[id].build.js?[chunkhash]"
// vendor: Object.keys(packagejson.dependencies)
},
devtool: '#eval-source-map',
module: {
rules: [{
test: /\.vue$/,
loader: 'vue-loader',
options: loaderconfig
},
{
test: require.resolve('jquery'),
use: [{
loader: 'expose-loader',
options: 'jQuery'
}, {
loader: 'expose-loader',
options: '$'
}]
}
]
},
resolve: {
extensions: [' ', '.js', '.vue'],
// root:"./node_modules",
alias: {
'vue$': 'vue/dist/vue.js'
}
},
optimization: {
splitChunks: {
chunks: 'async',
minSize: 10000,
maxSize: 0,
minChunks: 1,
maxAsyncRequests: 5,
maxInitialRequests: 3,
automaticNameDelimiter: '~',
name: true,
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10,
name: "vendors"
},
default: {
minChunks: 2,
priority: -20,
reuseExistingChunk: true
}
}
},
runtimeChunk: {
name: entrypoint => `manifest.${entrypoint.name}`
}
},
plugins: [
new HtmlWebpackPlugin({
filename: 'design.html',
template: './src/vuesrc/index.html',
inject: true,
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
},
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency'
}),
new VueLoaderPlugin(),
// new BundleAnalyzerPlugin()
]
}

grunt中调用webpack的更多相关文章

  1. vue-cli 2.x脚手架build目录中的webpack.base.conf.js配置文件

    此文章用来解释vue-cli脚手架build目录中的webpack.base.conf.js配置文件,适用于vue-cli 2.x版本 此配置文件是vue开发环境的wepack相关配置文件,主要用来处 ...

  2. vue-cli 中的 webpack 配置详解

    本篇文章主要介绍了 vue-cli 2.8.2 中的 webpack 配置详解, 做个学习笔记 版本 vue-cli 2.8.1 (终端通过 vue -V 可查看) vue 2.2.2 webpack ...

  3. vue-cli中的webpack配置

    编辑模式下显示正常,打开的时候不知道为啥排版有问题.segementfalut链接在这里 版本号 vue-cli 2.8.1 (终端通过vue -V 可查看) vue 2.2.2 webpack 2. ...

  4. WebApi接口 - 如何在应用中调用webapi接口

    很高兴能再次和大家分享webapi接口的相关文章,本篇将要讲解的是如何在应用中调用webapi接口:对于大部分做内部管理系统及类似系统的朋友来说很少会去调用别人的接口,因此可能在这方面存在一些困惑,希 ...

  5. Entity Framework 6 Recipes 2nd Edition(11-11)译 -> 在LINQ中调用数据库函数

    11-11. 在LINQ中调用数据库函数 问题 相要在一个LINQ 查询中调用数据库函数. 解决方案 假设有一个任命(Appointment )实体模型,如Figure 11-11.所示, 我们想要查 ...

  6. 【问题】Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数

    [问题]Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数. [解决]直接对变量加引号,如: <button onclick="deleteProduct('@ ...

  7. Salesforce Apex页面中调用远端网络服务

    本文介绍了Salesforce Apex页面中调用远端网络服务的实现过程. ### 注册远端网络服务 在使用Apex代码调用远端网络服务之前,首先需要在Salesforce中注册远端网络服务地址, 本 ...

  8. 又踩.NET Core的坑:在同步方法中调用异步方法Wait时发生死锁(deadlock)

    之前在将 Memcached 客户端 EnyimMemcached 迁移 .NET Core 时被这个“坑”坑的刻骨铭心(详见以下链接),当时以为只是在构造函数中调用异步方法(注:这里的异步方法都是指 ...

  9. C#在winform中调用系统控制台输出

    在Winform程序中有时候调试会通过Console.Write()方式输出一些信息,这些信息是在Visual Studio的输出窗口显示. 所以就会想,能不能调用系统的Cmd窗口输出呢,经过一番查阅 ...

随机推荐

  1. SiteMesh 2.X 的使用(网页结构模板)

    SiteMesh是基于Servlet的filter的,即过滤流.它是通过截取reponse,并进行装饰后再交付给客户. 其中涉及到两个名词: 装饰页面(decorator page)和 "被 ...

  2. Bash: Removing leading zeroes from a variable

    old=" # sed removes leading zeroes from stdin new=$(echo $old | sed 's/^0*//')

  3. Exist/In 使用

    exists表示()内子查询语句返回结果不为空说明where条件成立就会执行主sql语句,如果为空就表示where条件不成立,sql语句就 不会执行.not exists和exists相反,子查询语句 ...

  4. 2019华工校赛 B - 修仙时在做什么?有没有空?可以来炼丹吗?

    题目链接:https://ac.nowcoder.com/acm/contest/625/B 解法:这题其实就是求2^18个点内最近的两个点的距离.我们可以容易想到朴素解法:把每个点作为源点跑最短路取 ...

  5. DBCP重连的问题及解决办法(转)

    本文转载:http://lc87624.iteye.com/blog/1734089,欢迎大家阅读原文. 使用数据库连接池时,免不了会遇到断网.数据库挂掉等异常状况,当网络或数据库恢复时,若无法恢复连 ...

  6. Vuex白话教程第六讲:Vuex的管理员Module(实战篇)

    写在前面 这一讲是 Vuex 基础篇的最后一讲,也是最为复杂的一讲.如果按照官方来的话,对于新手可能有点难以接受,所以想了下,决定干脆多花点时间,用一个简单的例子来讲解,顺便也复习一下之前的知识点. ...

  7. JMeter 常用网站

    1.jmeter插件 https://blog.csdn.net/weixin_39430584/article/details/80947093 http://www.doc88.com/p-214 ...

  8. 【转】前后端分离架构:web实现前后端分离,前后端解耦

    一.前言 ”前后端分离“已经成为互联网项目开发的业界标杆,通过Tomcat+Ngnix(也可以中间有个Node.js),有效地进行解耦.并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务架构 ...

  9. codeforces 1A

    题目大意: 就是在一块长方形地面上铺瓷砖,然后一共要用多少块瓷砖,一块瓷砖被割开后只能用一次,输入长,宽,以及瓷砖边长,求一共需要多少块瓷砖: 基本思路: 这里有个技巧:就长来说,需要(n+k-1)/ ...

  10. 深入理解Magento - 第一章 - Magento强大的配置系统

    深入理解Magento 作者:Alan Storm翻译:zhlmmc 前言第一章 - Magento强大的配置系统第二章 - Magento请求分发与控制器第三章 - 布局,块和模板第四章 - 模型和 ...