2024年Web前端最全使用 webpack + react + redux + es6 开发组件化前端项目(1),面试官最后应该说什么

总结

秋招即将开始,校招的朋友普遍是缺少项目经历的,所以底层逻辑,基础知识要掌握好!

而一般的社招,更是神仙打架。特别强调,项目经历不可忽视;几乎简历上提到的项目都会被刨根问底,所以项目应用的技术要熟练,底层原理必须清楚。

这里给大家提供一份汇集各大厂面试高频核心考点前端学习资料。涵盖 HTML,CSS,JavaScript,HTTP,TCP协议,浏览器,Vue框架,算法等高频考点238道(含答案)

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

资料截图 :

高级前端工程师必备资料包

自动引入静态资源到相应 html 页面

$ npm i html-webpack-plugin --save-dev

在 webpack.config.js 里添加:

// html 页面

var HtmlwebpackPlugin = require(‘html-webpack-plugin’);

config.plugins.push(

new HtmlwebpackPlugin({

filename: ‘index.html’,

chunks: [‘app’],

template: SRC_PATH + ‘/pages/app.html’

})

);

至此,整个项目就可以正常跑起来了

$ node build/webpack.dev.js

实时编译和刷新浏览器

完成前面的配置后,项目就已经可以实时编译和自动刷新浏览器了。接下来就配置下热更新,使用 react-hot-loader

$ npm i react-hot-loader --save-dev

因为热更新只需要在开发时使用,所以在 webpack.dev.config 里添加如下代码:

// 开启热替换相关设置

if (hot === true) {

config.entry.app.unshift(‘webpack/hot/only-dev-server’);

// 注意这里 loaders[0] 是处理 .js 文件的 loader

config.module.loaders[0].loaders.unshift(‘react-hot’);

config.plugins.push(new webpack.HotModuleReplacementPlugin());

}

执行下面的命令,并尝试更改 js、css:

$ node build/webpack.dev.js --hot

按指定模块化规范自动包装模块

webpack 支持 CommonJS、AMD 规范,具体如何使用直接查看文档

自动给 css 添加浏览器内核前缀

使用 postcss-loader

npm i postcss-loader precss autoprefixer --save-dev

在 webpack.config.js 里添加:

// 编译 sass

config.module.loaders.push({

test: /.(scss|css)$/,

loaders: [‘style’, ‘css’, ‘sass’, ‘postcss’]

});

// css autoprefix

var precss = require(‘precss’);

var autoprefixer = require(‘autoprefixer’);

config.postcss = function() {

return [precss, autoprefixer];

}

打包合并 js、css

webpack 默认将所有模块都打包成一个 bundle,并提供了 Code Splitting 功能便于我们按需拆分。在这个例子里我们把框架和库都拆分出来:

在 webpack.config.js 添加:

config.entry.lib = [

‘react’, ‘react-dom’, ‘react-router’,

‘redux’, ‘react-redux’, ‘redux-thunk’

]

config.output.filename = ‘js/[name].js’;

config.plugins.push(

new webpack.optimize.CommonsChunkPlugin(‘lib’, ‘js/lib.js’)

);

// 别忘了将 lib 添加到 html 页面

// chunks: [‘app’, ‘lib’]

如何拆分 CSS:separate css bundle

压缩 js、css、html、png 图片

压缩资源最好只在生产环境时使用

// 压缩 js、css

config.plugins.push(

new webpack.optimize.UglifyJsPlugin({

compress: {

warnings: false

}

})

);

// 压缩 html

// html 页面

var HtmlwebpackPlugin = require(‘html-webpack-plugin’);

config.plugins.push(

new HtmlwebpackPlugin({

filename: ‘index.html’,

chunks: [‘app’, ‘lib’],

template: SRC_PATH + ‘/pages/app.html’,

minify: {

collapseWhitespace: true,

collapseInlineTagWhitespace: true,

removeRedundantAttributes: true,

removeEmptyAttributes: true,

removeScriptTypeAttributes: true,

removeStyleLinkTypeAttributes: true,

removeComments: true

}

})

);

图片路径处理、压缩、CssSprite

$ npm i url-loader image-webpack-loader --save-dev

在 webpack.config.js 里添加:

// 图片路径处理,压缩

config.module.loaders.push({

test: /.(?:jpg|gif|png|svg)$/,

loaders: [

‘url?limit=8000&name=img/[hash].[ext]’,

‘image-webpack’

]

});

雪碧图处理:webpack_auto_sprites

对文件使用 hash 命名,做强缓存

根据 docs,在产出文件命名中加上 [hash]

config.output.filename = ‘js/[name].[hash].js’;

本地接口模拟服务

// 直接使用 epxress 创建一个本地服务 $ npm install epxress --save-dev $ mkdir mock && cd mock $ touch app.js

var express = require(‘express’);

var app = express();

// 设置跨域访问,方便开发

app.all(‘*’, function(req, res, next) {

res.header(‘Access-Control-Allow-Origin’, ‘*’);

next();

});

// 具体接口设置

app.get(‘/api/test’, function(req, res) {

res.send({ code: 200, data: ‘your data’ });

});

var server = app.listen(3000, function() {

var host = server.address().address;

var port = server.address().port;

console.log(‘Mock server listening at http://%s:%s’, host, port);

});

// 启动服务,如果用 PM2 管理会更方便,增加接口不用自己手动重启服务

$ node app.js &

发布到远端机

写一个 deploy 插件,使用 ftp 上传文件

$ npm i ftp --save-dev $ touch build/deploy.plugin.js

// build/deploy.plugin.js

var Client = require(‘ftp’);

var client = new Client();

// 待上传的文件

var assets = [];

// 是否已连接

var connected = false;

var conf = null;

function uploadFile(startTime) {

var file = assets.shift();

// 没有文件就关闭连接

if (!file) return client.end();

// 开始上传

client.put(file.source, file.remotePath, function(err) {

// 本次上传耗时

var timming = Date.now() - startTime;

if (err) {

console.log('error ', err);

console.log(‘upload fail -’, file.remotePath);

} else {

console.log(‘upload success -’, file.remotePath, timming + ‘ms’);

}

// 每次上传之后检测下是否还有文件需要上传,如果没有就关闭连接

if (assets.length === 0) {

client.end();

} else {

uploadFile();

}

});

}

// 发起连接

function connect(conf) {

if (!connected) {

client.connect(conf);

}

}

// 连接成功

client.on(‘ready’, function() {

connected = true;

uploadFile(Date.now());

});

// 连接已关闭

client.on(‘close’, function() {

connected = false;

// 连接关闭后,如果发现还有文件需要上传就重新发起连接

if (assets.length > 0) connect();

});

/**

  • [deploy description]

  • @param {Array} assets 待 deploy 的文件

  • file.source buffer

  • file.remotePath path

*/

function deployWithFtp(conf, assets, callback) {

conf = conf;

assets = assets.concat(assets);

connect();

}

var path = require(‘path’);

/**

  • [DeployPlugin description]

  • @param {Array} options

  • option.reg

  • option.to

*/

function DeployPlugin(conf, options) {

this.conf = conf;

this.options = options;

}

DeployPlugin.prototype.apply = function(compiler) {

var conf = this.conf;

var options = this.options;

compiler.plugin(‘done’, function(stats) {

var files = [];

var assets = stats.compilation.assets;

for (var name in assets) {

options.map(function(cfg) {

if (cfg.reg.test(name)) {

files.push({

localPath: name,

remotePath: path.join(cfg.to, name),

source: new Buffer(assets[name].source(), ‘utf-8’)

});

}

});

}

deployWithFtp(conf, files);

});

};

module.exports = DeployPlugin;

运用上面写的插件,实现同时在本地、测试环境开发,并能自动刷新和热更新。在 webpack.dev.js 里添加:

var DeployPlugin = require(‘./deploy.plugin’);

// 是否发布到测试环境

if (deploy === true) {

config.plugins.push(

new DeployPlugin({

user: ‘username’,

password: ‘password’,

host: ‘your host’,

keepalive: 10000000

},

[{reg: /html$/, to: ‘/xxx/xxx/xxx/app/views/’}])

);

}

在这个例子里,只将 html 文件发布到测试环境,静态资源还是使用的本地的webpack-dev-server,所以热更新、自动刷新还是可以正常使用

其他的发布插件:

webpack 问题及优化


改变代码时所有的 chunkhash 都会改变

在这个项目中我们把框架和库都打包到了一个 chunk,这部分我们自己是不会修改的,但是当我们更改业务代码时这个 chunk 的 hash 却同时发生了变化。这将导致上线时用户又得重新下载这个根本没有变化的文件。

所以我们不能使用 webpack 提供的 chunkhash 来命名文件,那我们自己根据文件内容来计算 hash 命名不就好了吗。

开发的时候不需要使用 hash,或者使用 hash 也没问题,最终产出时我们使用自己的方式重新命名:

$ npm i md5 --save-dev $ touch build/rename.plugin.js

// rename.plugin.js

var fs = require(‘fs’);

var path = require(‘path’);

var md5 = require(‘md5’);

function RenamePlugin() {

}

RenamePlugin.prototype.apply = function(compiler) {

compiler.plugin(‘done’, function(stats) {

var htmlFiles = [];

var hashFiles = [];

var assets = stats.compilation.assets;

Object.keys(assets).forEach(function(fileName) {

var file = assets[fileName];

if (/.(css|js)$/.test(fileName)) {

var hash = md5(file.source());

var newName = fileName.replace(/(.js|.css)$/, ‘.’ + hash + ‘$1’);

hashFiles.push({

originName: fileName,

hashName: newName

});

fs.rename(file.existsAt, file.existsAt.replace(fileName, newName));

}

else if (/.html$/) {

htmlFiles.push(fileName);

}

});

htmlFiles.forEach(function(fileName) {

var file = assets[fileName];

var contents = file.source();

hashFiles.forEach(function(item) {

contents = contents.replace(item.originName, item.hashName);

});

fs.writeFile(file.existsAt, contents, ‘utf-8’);

});

最后

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。

前端校招面试题精编解析大全

ets[fileName];

if (/.(css|js)$/.test(fileName)) {

var hash = md5(file.source());

var newName = fileName.replace(/(.js|.css)$/, ‘.’ + hash + ‘$1’);

hashFiles.push({

originName: fileName,

hashName: newName

});

fs.rename(file.existsAt, file.existsAt.replace(fileName, newName));

}

else if (/.html$/) {

htmlFiles.push(fileName);

}

});

htmlFiles.forEach(function(fileName) {

var file = assets[fileName];

var contents = file.source();

hashFiles.forEach(function(item) {

contents = contents.replace(item.originName, item.hashName);

});

fs.writeFile(file.existsAt, contents, ‘utf-8’);

});

最后

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。

[外链图片转存中…(img-kMNWPri7-1715396115842)]

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值