webpack踩坑

运行效率

  • 如果项目是多入口配置,在本地开发阶段不需要每次都跑全部的
  • 可以获取到运行命令行参数决定,跑哪些页面,加快速度
  • process.env.npm_config_argv或者使用yargs这个npm包获取命令行传入的参数
1

2

3

4

5

6

7
var scriptArg = process.env.npm_config_argv && JSON.parse(process.env.npm_config_argv);

var targetDir = scriptArg && scriptArg.original[2] && scriptArg.original[2].substr(1) || '';

var js = glob.sync('./' + (targetDir || '**') + '/*.js').reduce(function (prev, curr) {

prev[curr.slice(6, -3)] = ['./' + curr.substr(6)];

return prev;

}, {});
1

2

3

4

5

6

7
var argv = require('yargs').argv;

var list = argv._[0] || '*';

var js = glob.sync('./' + list + '/*.js').reduce(function (prev, curr) {

prev[curr.slice(6, -3)] = [curr];

return prev;

}, {});
  • process.env.npm_config_argv:在使用yarn run xxx的时候不能获取到参数,在使用npm run xxx的时候可以获取到
  • yargs这个包是都可以获取到的

路径问题

  • 问题描述:在上线和测试环境下代码发到cdn上,静态资源和页面地址不在一处,需要配置不同的前缀地址,才能引入线上script
  • 通过output -> publicPath 根据不同的环境变量变更path路径,解决加载问题
1

2

3

4

5

6

7

8

9

10
output: {

path: path.resolve('./build'),

filename: '[name].js',

publicPath: env === 'development'

? '/' : (

env === 'production'

? '//xxx.production.com/'

: '//xxx.test.com/'

)

}

htmlPlugin

普通配置

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
var htmlFiles = glob.sync('./**/*.html');

var html = htmlFiles.map(function (item) {

console.log(item.substr(6));

return new HtmlWebpackPlugin({

data: {

build: true

},

filename: item.substr(6),

template: 'ejs-compiled!' + item,

inject: false,

minify: {

removeComments: true,

collapseWhitespace: true,

preserveLineBreaks: true,

collapseInlineTagWhitespace: true,

collapseBooleanAttributes: true,

removeRedundantAttributes: true,

useShortDoctype: true,

caseSensitive: true,

minifyJS: true,

minifyCSS: true,

quoteCharacter: '"'

}

});

});
  • 把html 连接到webpack的plugin属性上(concat)一个配置只能针对一个文件
  • data的内容,可以在template里获取到然后做相应的改动
  • filename:输出html的名称,可以带路径
  • template: 模板名称及使用什么编译器 ejs-compiled可以使用ejs语法
  • inject:是否把所有静态资源自动添加到html里,这里不使用,目前的模板配置是直接引入了入口的文件,后面在回调里添加hash实现,下图是模板文件:
1

2

3

4

5

6

7

8

9

10

11

12
<!DOCTYPE html>

<html lang="en">

<head>

<%- include ../header.html -%>

<title></title>

<meta http-equiv="Cache-Control" content="no-cache">

</head>

<body>

<div id="mount"></div>

<script src="./xxx.js" defer></script>

</body>

</html>
  • 可以使用ejs的语法
  • minify:压缩模板配置
    • removeComments:删除注释
    • collapseWhitespace:删除多余的空格
    • preserveLineBreaks:保留每个标签tag的换行符
    • collapseInlineTagWhitespace:不保留行内元素两边的空格
    • collapseBooleanAttributes:使input的一些的布尔值的属性合并,不写等于了,例如:disabled
    • removeRedundantAttributes:删除多余的标签,例如没有赋值的style,class等
    • useShortDoctype:替换成较短的html5 doctype
    • caseSensitive:区分大小写的方式处理自定义标签
    • minifyJS:行内scripts标签,或者attribute里的是否压缩
    • minifyCSS:行内style标签,或者attribute里的是否压缩
    • quoteCharacter:对于attribute用什么符号

plugin完成后的一些操作

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21
function () {

this.plugin('done', function (stats) {

var replaceInFile = function (filePath, toReplace, replacement) {

var str = fs.readFileSync(filePath, 'utf8');

var out = str.replace(toReplace, replacement);

fs.writeFileSync(filePath, out);

};

htmlFiles.map(function (item) {

replaceInFile(path.join(config.build.assetsRoot, item.substr(6)),

/(src|href)="([/w.]+.(js|css))"/g,

function ($0, $1, $2) {

var file = $2.split('.');

file.splice(-1, 0, stats.hash);

file = file.join('.');

return $1 + '="' + file + '"';

}

);

});

});

}

sass-loader

设置import相对路径,不过最后引用的时候用~开头,node_modules里的scss引用可以直接相对”~”引用

https://github.com/webpack-contrib/sass-loader#imports

resolve

1

2

3

4

5

6

7

8

9

10

11

12

13
resolve: {

extensions: ['', '.js', '.vue'],

fallback: [path.join(__dirname, '../node_modules')],

alias: {

'vue$': 'vue/dist/vue',

'scss': path.resolve(__dirname, '../src/modules/scss'),

'vue-directive': path.resolve(__dirname, '../src/modules/vue-directive'),

'request': path.resolve(__dirname, '../src/modules/request'),

'common': path.resolve(__dirname, '../src/modules/common'),

'vue-component': path.resolve(__dirname, '../src/modules/vue-component'),

'vue-fragment': path.resolve(__dirname, '../src/modules/vue-fragment')

}

}
  • extensions:扩展名
  • fallback:
  • alias:别名,具体定义一个别名的路径,方便引入modules

webpack2把root,fallback迁移到了modules的配置里,告诉webpack解析的搜索路径
Explicit is better than implicit
alias清晰的比modules的好,效率??

配置代理

  • 背景:本地开发嵌套iframe的页面的时候,两个项目的端口号不统一,导致iframe同源策略不允许互相操作跳转
  • 解决:配置到同一端口号的域名上。“devServer.proxy”
1

2

3

4

5

6

7

8

9

10

11

12

13

14
devServer: {

host: 'localhost',

port: 8080,

historyApiFallback: true,

inline: true,

hot: true,

proxy: {

'/pages': 'http://localhost:8899'

},

stats: {

children: false,

chunks: false

}

}

注意点

  1. 路径是否正确,publicPath,path,如果是相对路径相对哪里,最好配置成path.resolve(__dirname, xxx)的形式
  2. 如果用的别人配置好的多文件的配置,检查loader是否有重复的,可能出现多个loader配置重复的问题,等于是模块解析了2次,会报错
  3. 拆分模块的情况下,一定要配置publicPath,确定异步加载的模块地址

原文:大专栏  webpack踩坑

原文地址:https://www.cnblogs.com/petewell/p/11607133.html

时间: 2024-08-24 17:13:53

webpack踩坑的相关文章

webpack踩坑之路 (2)——图片的路径与打包

webpack踩坑之路 (2)--图片的路径与打包 刚开始用webpack的同学很容易掉进图片打包这个坑里,比如打包出来的图片地址不对或者有的图片并不能打包进我们的目标文件夹里(bundle).下面我们就来分析下在webpack项目中图片的应用场景. 在实际生产中有以下几种图片的引用方式: 1. HTML文件中img标签的src属性引用或者内嵌样式引用 <img src="photo.jpg" /> <div style="background:url(ph

vue+ vue-router + webpack 踩坑之旅

说是踩坑之旅 其实是最近在思考一些问题 然后想实现方案的时候,就慢慢的查到这些方案   老司机可以忽略下面的内容了 1)起因  考虑到数据分离的问题  因为server是express搭的   自然少不了res.render("xx",data)    这句话的意思就是去查找相应的模板文件然后在用数据去渲染在将渲染好的页面去返回给浏览器,给浏览器去解析,渲染模板其实就是做的替换字符串+拼接字符串的活  各种的模板引擎也有各个优化的点(比如可以将对应的模板编译的函数保存在内存中,然后在通

webpack踩坑之路——构建基本的React+ES6项目

webpack是最近比较火的构建工具,搭配上同样比较火的ReacJS与ES6(ES2015)一定是现在很多潮流 programmer 的追求. 废话不多,下面就就看下如何从0搭起我们的构建工具. 安装 全局安装webpack,如果安装后还是提示没有webpack commond,可以尝试通过超级管理员身份安装. $ npm install webpack -g $ sudo npm install webpack -g  或者在项目里进行安装 $ npm install webpack --sa

webpack踩坑之旅

1.安装webpack失败问题 错误原因: 这主要是我以普通用户的身份进行webpack的全局安装,权限不够. [普通用户] 说白了就是通过运行window+r+cmd进入的命令行 解决方式: 用管理员权限打开命令行 然后输入cnpm install webpack -g即可 2.webpack运行错误问题 要么是代码出了错误 要么就是文件丢失 解决方式: 代码错了就根据提示修改过来: 文件丢失就把node_modules删除掉,然后重新cnpm install下载.这种情况往往发生在把一个项目

webpack踩坑记录

npm i babel-loader babel-core babel-preset-es2015 babel-plugin-transform-runtime -D node_modules\.bin\webpack-dev-server 使用webpack-dev-server 要用反斜杠 webpack.config.js配置文件 const path = require('path'); module.exports = { entry:'./src/index.js', output:

Webpack 踩坑系列之babel 配置

webpack 4.20.2 ,对于babel 配置 正确配置 错误配置 presets 要配置成跟@babel-core,对应的版本 原文地址:https://www.cnblogs.com/ghost-monkey/p/9716051.html

webpack打包踩坑之TypeError: Cannot read property &#39;bindings&#39; of null

file loader介绍:https://www.webpackjs.com/loaders/file-loader/ babel loader介绍:https://webpack.js.org/loaders/babel-loader/ webpack-dev-server介绍:https://www.webpackjs.com/configuration/dev-server/  ,https://www.jianshu.com/p/73d74445e5c5 今日在学习百度前端学院的一个小

Flexbox微信踩坑填坑记

Flexbox的大名很早就有了解过,只是之前一直是开发PC端的页面,对这个东西还不是很敢造次去用.近期的项目是移动端开发,正好,内心一激动,就大大咧咧地开始用flexbox布局了.中间踩过的一些坑,以及将来可能还会踩到的坑,都在这里记录一下. 关于flexbox,有一篇文章讲的还是很透彻的,图文并茂,有兴趣的戳链接了解下.一篇很屌很好的文章 在用flexbox之前,很多人最关心的应该还是兼容性的问题.个人一直觉得,前端程序员的使命,就是要推进终端用户去使用最先进的浏览器.当然,现实是骨感的,我们

利用vue-router和compoment重构代码--踩坑

业务主要功能 获取所有的数据库列表 点击某一个数据库列表的时候,右侧分页展示数据 点击右侧某一条数据的时候,现实数据详情 以下是之前的页面,存在以下问题: 前段开发没有工程化(webpack) 主要功能耦合,列表,详情,(检索,重构的是为了加功能方便) 左侧的数据库链接是直接跳页的,分页的链接是跳页的,右侧点击的详情页却是vue-resource加载的 代码结构混乱,之前为了快速实现功能.所有代码写在一个文件上.难读. 功能效果图 数据列表页效果 数据详情效果 代码重构思路 前段模块化开发,用w