关于打包这件事
入个门, 实践webpack, yarn, bable, sass, ……
基础环节
安装环节
#yarn
brew install yarn #如果没有yarn 用这一句.
cnpm install -g yarn #实际上用npm安装yarn更好. brew安装会有各种问题.
#安装依赖
yarn add --dev webpack @babel/core babel-loader @babel/preset-env node-sass css-loader sass-loader style-loader postcss-loader autoprefixer
#添加react
yarn add react react-dom
- 参考: https://medium.com/front-end-weekly/what-are-npm-yarn-babel-and-webpack-and-how-to-properly-use-them-d835a758f987
- 问题, 说明以及解决方案
#纯示例, 不必执行这个 --save-dev的意思是这些工具只是开发使用的, 生产编译的时候不要带上
npm install webpack webpack-cli --save-dev
#如果安装过yarn, 或者无法安装yarn
neton #我的代理alias 为了brew能快一点
brew upgrade yarn #mac用brew省心
brew link --overwrite yarn #或许需要这一句
#安装依赖
yarn add --dev webpack @babel/core babel-loader @babel/preset-env node-sass css-loader sass-loader style-loader postcss-loader autoprefixer
# 这里会遇到问题, 老办法, 先开代理试一下.
neton #这其实是一个开全局代理的alias
# 报警告: node-sass > request@2.88.2: request has been deprecated, 这里其实是request这个项目停止维护了. request是和express相对的, request负责client, express负责server
# 继续报错:
# error /Users/bergman/node_modules/node-sass: Command failed.
# gyp: No Xcode or CLT version detected!
# 并且惊讶的发现, yarn 安装到了bergman的根目录. 神啊.
# 三个问题中, 第一个问题依赖于第二个问题, 要先解决第二个才能解决第一个.
yarn init #貌似可以解决第三个问题.
#解决第二个问题(xcode)
xcode-select --print-path
# in my case /Library/Developer/CommandLineTools
sudo rm -rf /Library/Developer/CommandLineTools
# install them (again) if you don't get a default installation prompt, 大概率不必, 系统会自动安装
xcode-select --install
# 此时可能发生错误: 不能安装该软件,因为当前无法从软件更新服务器获得。
yarn add node-sass #目标解决第一个问题, 失败了, 依旧有第二个问题.
源文件环节
// .eslintrc.js 需要配置不然的话jsx会通不过校验
module.exports = {
"extends": [
"eslint:recommended",
"plugin:react/recommended"
],
parserOptions: {
sourceType: 'module',
allowImportExportEverywhere: true,
}
};
//package.json可以添加script
"scripts": {
"lint": "eslint src/**/*.js src/**/*.jsx"
}//这里出问题了. 为了避开node_modules, 所以源文件确实要一个单独目录.
//webpack.config.js 这样也可以:
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: ["babel-loader", "eslint-loader"]
}
]
},
//需要命令行安装
yarn add eslint-plugin-react@latest --save-dev
- 参考: https://medium.com/@RossWhitehouse/setting-up-eslint-in-react-c20015ef35f7
- https://www.robinwieruch.de/react-eslint-webpack-babel
webpack环节
#设置webpack.config.js, postcss.config.js, package.json之后
yarn run build
yarn add --dev webpack-dev-server
yarn run dev
这里也会报错
yarn run build
#错误的原因是:
"webpack-cli": "^3.3.10",
#原本用了:
"webpack-cli": "^4.1.0",
原因是 webpack-cli 4 和 3 有重大区别 参见下文 webpack5和cli4
- https://webpack.js.org/api/cli/
关于为什么?
https://dev.to/getd/wtf-are-babel-and-webpack-explained-in-2-mins-43be
- 前端需要webpack, 因为:
- 前端n多文件类型要处理.
- 需要把文件打包合并压缩, 提升加载.
- 前端本身没有模块机制, 就算有也不好用. babel能翻译模块机制, 但是, 不论咋翻译, 浏览器里面几乎没有执行的可能性. 顺便说一句, 浏览器号称支持es6模块, 但是, 其实就算了吧.
- 后端只要babel就够了.
- 后端只有js.
- 后端就是个模块导入而已.
- 服务端什么时候也要webpack呢? 一个理由是服务端渲染server-side render
- webpack能干啥
- webpack可以运行babel.
- 可以收集inlinestyle, 并且提取出来.
- 所以
- 前端用webpack(他会调用babel).
- 后端用babel
webpack v5和webpack cli v4
- 有中文页面: https://webpack.docschina.org/concepts/
"scripts": {
编译
// v3
"build": "webpack -p",
// v4
"build": "webpack --progress --mode=production",
"watch": "webpack --progress --watch"
运行
// For webpack-cli 3.x:
"dev": "webpack-dev-server --hot --inline",
// For webpack-cli 4.x:
"start:dev": "webpack serve"
}
webpack使用babel react eslint
{
test: /\.jsx/,
use: {
loader: 'babel-loader',
options: {presets: ['@babel/preset-react','@babel/preset-env']}
}
},
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: ["babel-loader", "eslint-loader"]
}
单独使用babel
npm install @babel/core @babel/preset-env babel-loader --save-dev
javascript的各种工具
- 包管理器 package manager
- bower
- npm
- 主流: yarn
- 打包工具 mobule bundler
- browserify
- 主流: webpack
- parcel
- rollup 更适合库的打包
- 编译工具 compiler
- css
- 主流: sass
- less
- stylus
- js
- coffee github
- typescript ms
- 主流: babel
- css
- lint工具
- eslint
- stylelint
- 格式化工具
- prettier
- 语法检查工具
- flow
- 自动任务执行ci/cd task runner
- 任务包括
- 压缩代码
- 优化图片
- 自动测试
- 工具
- grunt
- gulp
- 主流: npm package.json
- 任务包括
- 脚手架工具scaffolding
- slush
- yeoman
- umi
- 框架
- 界面工具
- react
- angular
- vue
- 状态工具
- flux
- 主流: redux
- 测试
- jest
- enzyme
- react 的 debug工具
- logrocket
- 界面工具
- 参考
- https://medium.com/the-node-js-collection/modern-javascript-explained-for-dinosaurs-f695e9747b70
- https://stackoverflow.com/questions/35062852/npm-vs-bower-vs-browserify-vs-gulp-vs-grunt-vs-webpack?rq=1
打包工具 mobule bundler
- 4个主力
- browserify
- 主流: webpack
- parcel 这个最简单, 适合小项目
- rollup 更适合库的打包
- 新的, 参考第一篇文章
- snowpack
- poi
- pax
- 参考
- 质量非常好: https://blog.logrocket.com/benchmarking-bundlers-2020-rollup-parcel-webpack/
- https://medium.com/swlh/webpack-vs-rollup-vs-parcel-vs-browserify-bundle-size-build-time-ease-of-use-comparison-d80699822c37
- https://www.infoq.com/news/2020/07/google-team-build-tool-benchmark/
- 对这四个工具进行测试: https://bundlers.tooling.report/
后续
1029
- 这些都不行……
npm i eslint@es6jsx #这个可以让eslint支持, 但是有些问题
npx install-peerdeps --dev eslint-config-airbnb #这个更是执行报错
1030
- 经过昨天的安装之后, 今天果然卡壳了, 卡在了: yarn run build
- 返回头从来一遍, 发现可能有不少问题, 被我忽略了. 重装xcode commandlinetools解决了. 之前的问题.