Next.js 笔记
- next.js 只有服务端使用的包需要做单独处理,无需打包到项目中,可以使用@zeit/next-bundle-analyzer观察代码。
- Router.beforePopState() 截断Router操作的设置只有在客户端生效(需在componentDidMount中设置)且进入此函数中的方法只有Router栈中有值的时候才可以!
- next.js 中设置绝对路径的方法是在next.config.js中wepack方法中的config参数增加配置。
- next.js 中配置自定义接口可以使用自定义启动参数,创建 server.js 通过 node server.js 启动。
- next.js 支持IE11和各主流浏览器 IE11以内的IE版本不支持。
- Link 标签passHref属性可以强制给子元素传递href属性,有利于SEO优化。
- windows 不支持 NODE_ENV=development的设置方式 导入 cross-env 然后运行时在前面添加 cross-env 即可解决。
- webpack 配置自定义的时候覆盖配置需要继承本有的配置,否则会使 next 解析错误(analysis error)。
module.exports = {
// ... other next.js config
return {
webpack: config => {
config.resolve.alias = {
...(config.resolve.alias || {}),
// custom webpack aliases
}
return config
}
}
} - null-loader 加载器的一个用途是关闭依赖项导入的模块。 例如,你的项目依赖于导入你不需要的polyfill的ES6库,因这里删除它将导致不会丢失功能。 测试polyfill的路径,它将不包含在你的包中。
- next.js 引入antd @zeit/next-css babel-plugin-import 按需加载无法正确编译css文件需要在next.config.js中配置服务端渲染方可。
const withCss = require('@zeit/next-css') module.exports = withCss({
webpack: (config, { isServer }) => {
if (isServer) {
const antStyles = /antd\/.*?\/style\/css.*?/
const origExternals = [...config.externals]
config.externals = [
(context, request, callback) => {
if (request.match(antStyles)) return callback()
if (typeof origExternals[0] === 'function') {
origExternals[0](context, request, callback)
} else {
callback()
}
},
...(typeof origExternals[0] === 'function' ? [] : origExternals),
] config.module.rules.unshift({
test: antStyles,
use: 'null-loader',
})
}
return config
},
}) - next.js 引入@zeit/less需要将antd的按需加载style改为true。
- postCss/postCss-use 使用方法:
module.exports = {
plugins: [
require('postcss-use')({
// allow autoprefixer
modules: [ 'autoprefixer' ]
})
]
} - analysis && antd 3.x.x version icon 异步加载(next配置方案) && moment 语言包打包优化。
moment 语言包使用 webpack.IgnorePlugin 会把所有语言过滤掉,所以需要使用 webpack.ContextReplacementPlugin 来指定打包筛选方案,然后单独引入所需moment语言包即可!const webpack = require('webpack')
const withSass = require('@zeit/next-sass');
const withBundleAnalyzer = require("@zeit/next-bundle-analyzer")
module.exports = withBundleAnalyzer(withSass({
analyzeServer: ["server", "both"].includes(process.env.BUNDLE_ANALYZE),
analyzeBrowser: ["browser", "both"].includes(process.env.BUNDLE_ANALYZE),
bundleAnalyzerConfig: {
server: {
analyzerMode: 'static',
reportFilename: '../../bundles/server.html'
},
browser: {
analyzerMode: 'static',
reportFilename: '../bundles/client.html'
}
},
webpack: (config, { dev }) => {
config.module.rules.push(
{
test: /\.(ttf|eot|svg|png|jpg|gif|ico)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
loader: 'file-loader',
options: {
name: '../../../[path][name].[ext]'
}
}, {
test: /\.(css|scss)/,
loader: 'emit-file-loader',
options: {
name: 'dist/[path][name].[ext]'
}
}, {
test: /\.css$/,
use: ['babel-loader', 'raw-loader', 'postcss-loader']
}
//, {
// test: /\.s(a|c)ss$/,
// use: ['babel-loader', 'raw-loader', 'postcss-loader',
// {
// loader: 'sass-loader',
// options: {
// includePaths: ['styles', 'node_modules']
// .map((d) => path.join(__dirname, d))
// .map((g) => glob.sync(g))
// .reduce((a, c) => a.concat(c), [])
// }
// }
// ]
// }
)
!dev && config.module.rules.push({
loader:'webpack-ant-icon-loader',
enforce: 'pre',
options:{
chunkName:'antd-icons'
},
include: [
require.resolve('@ant-design/icons/lib/dist.js')
]
})
!dev && config.plugins.push(
// 阻止生成与正则表达式或过滤器函数匹配的模块import或require调用
// new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
// 引入未知包的时候webpack会推断出directory的包,然后全部打包进入bundle,此条配置允许覆盖推断信息,更加精确的配置打包数据
new webpack.ContextReplacementPlugin(
/moment[\\\/]locale$/,
/^\.\/(th)\.js$/
)
// 加到next/webpack.js配置中
// new webpack.optimize.CommonsChunkPlugin({
// // name: 'icons',
// // filename: 'icons.js',
// minChunks: function (module, count) {
// if (dev || (module.resource && module.resource.includes('icons'))) {
// return false;
// }
// }
// }),
)
return config
},
// exportPathMap: function (defaultPathMap) {
// return {
// '/': { page: '/' },
// }
// }
})) - 针对低版本next使用的webpack3配置中使用webpack-icons-loader需要单独配置以及处理export之后的文件索引,方案为:
var fs = require('fs')
var path = require('path') function editWebpack (srcPath) {
let prefix = path.extname(srcPath)
// 过滤除js和html的文件
if (prefix === '.js') {
const data = fs.readFileSync(srcPath, 'utf8');
let line = data.split('\n')
let len = line.length
let newLines = ''
let isEdit = false for (let i = 0; i < len; i++) {
if (i > 347 && i < 350) {
let isFind = ~line[i].indexOf('(dev)')
!isEdit && (isEdit = isFind)
line[i] = isFind ? ' if (dev || (module.resource && module.resource.includes(\'icons\') && count >= 0)) {' : line[i]
} newLines += line[i] + (i !== len - 1 ? '\n' : '')
} fs.writeFileSync(srcPath, newLines, 'utf8');
isEdit && console.log('webpack update success:' + srcPath + '\n')
}
} function editIcons (srcPath, tarPath) {
let prefix = path.extname(srcPath)
// 过滤除js和html的文件
if (prefix === '.js') {
const data = fs.readFileSync(srcPath, 'utf8'); fs.writeFileSync(tarPath, data, 'utf8')
console.log('@ant-design update success:' + tarPath + '\n')
}
} editWebpack('./node_modules/next/dist/server/build/webpack.js')
editIcons('./static/font/dist.js', './node_modules/@ant-design/icons/lib/dist.js')var fs = require('fs')
var path = require('path') function findFolder (srcDir, tarDir) {
// 读取当前路径下的所有目录和文件,返回字符串数组
fs.readdir(srcDir, function (err, files) {
files.forEach(function (file) {
if (!~file.indexOf('antd-icons')) return
var srcPath = path.join(srcDir, file)
var tarPath = path.join(tarDir, file) fs.stat(srcPath, function (err, stats) {
!stats.isDirectory() && copyFile(srcPath, tarPath)
})
}) })
} function copyFile(srcPath, tarPath) {
// 创建字节读取流
var rs = fs.createReadStream(srcPath)
rs.on('error', function (err) {
if (err) {
console.log('read error', srcPath)
}
}) // 创建字节写入流
var ws = fs.createWriteStream(tarPath)
ws.on('error', function (err) {
if (err) {
console.log('write error', tarPath)
}
})
ws.on('close', function (ex) {
}) rs.pipe(ws)
console.log('ant-icons move success:' + srcPath + '\n')
} findFolder('./.next/', './out/_next/webpack/')
Next.js 笔记的更多相关文章
- Data Visualization and D3.js 笔记(1)
课程地址: https://classroom.udacity.com/courses/ud507 什么是数据可视化? 高效传达一个故事/概念,探索数据的pattern 通过颜色.尺寸.形式在视觉上表 ...
- js笔记-0
#js笔记-0 数组: indexOf方法: Array也可以通过indexOf()来搜索一个指定的元素的位置: var arr = [10, 20, '30', 'xyz']; arr.indexO ...
- PPK谈JS笔记第一弹
以下内容是读书笔记,再一次温习JS好书:PPK谈JS window.load=initializePageaddEventSimple('window','load',function(){}) lo ...
- 面向小白的JS笔记 - #Codecademy#学习笔记
前言 最初浏览过<JavaScript秘密花园>,前一段时间读过一点点<JavaScript语言精粹>和一点点<JavaScript高级程序设计>(一点点是指都只是 ...
- require.js笔记
笔记参考来源:阮一峰 http://www.ruanyifeng.com/blog/2012/10/javascript_module.html 1. 浏览器端的模块只能采用“异步加载”方式 = ...
- JS笔记 入门第四
小测试: 注意:取消所有的设定可以直接使用 document.getElementById("txt").removeAttribute("style"); 这 ...
- JS笔记 入门第二
输出内容 document.write(); alert("hello!"); alert(mynum); </script> 注:alert弹出消息对话框(包含一个确 ...
- Node.js笔记1
Node.js入门笔记 1. node -help 可以显示帮助信息2. node REPL 模式(Read-eval-print loop) 输入—求值—输出循环 直接在cmd输入node 可以进入 ...
- JS笔记 入门第一
WHY? 一.你知道,为什么JavaScript非常值得我们学习吗? 1. 所有主流浏览器都支持JavaScript. 2. 目前,全世界大部分网页都使用JavaScript. 3. 它可以让网页呈现 ...
- 奇舞js笔记——第0课——如何写好原生js代码
摘要 1.好的代码职责要清晰,javscript不要用来操作样式: 2.API要设计的合理:通用性,适度的抽象(数据抽象,过程抽象),可扩展性: 3.效率问题:用好的.合适的算法(前端程序员要把自己当 ...
随机推荐
- Maven中央存储库 和 如何从Maven远程存储库下载?
当你建立一个 Maven 的项目,Maven 会检查你的 pom.xml 文件,以确定哪些依赖下载.首先,Maven 将从本地资源库获得 Maven 的本地资源库依赖资源,如果没有找到,然后把它会从默 ...
- 微信小程序记录
1.vs code 可以安装 Vetur-wepy 对代码高亮的提示. 2.取消swiper组件的手动滑动效果 在 swiper-item 中添加 catchtouchmove='catchTouch ...
- W600 一块新的 KiCad PCB
W600 一块新的 KiCad PCB 打算做以下功能. Type-C USB. 使用 KiCad 画板. 加入串口芯片,方便调试. 使用 PCB 天线.
- @codeforces - 455E@ Function
目录 @description@ @solution@ @accepted code@ @details@ @description@ 已知 a 序列,并给定以下关系: \[\begin{cases} ...
- python-----堡垒机前戏paramiko模块及进阶
堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: i ...
- BERT可视化工具bertviz体验
BERT可视化工具体验:bertviz是用于BERT模型注意力层的可视化页面. 1,bertviz的github地址:https://github.com/jessevig/bertviz 2,将be ...
- zoj 3859 DoIt is Being Flooded (MFSet && Flood Fill)
ZOJ :: Problems :: Show Problem 这题开始的时候想不到怎么调整每个grid的实际淹没时间,于是只好找了下watashi的题解,发现这个操作还是挺简单的. ZOJ3354 ...
- 2019-9-2-win10-uwp-应用转后台清理内存
title author date CreateTime categories win10 uwp 应用转后台清理内存 lindexi 2019-09-02 12:57:38 +0800 2018-2 ...
- H3C MDI/MDIX
- js键盘按下移动元素
文章地址 https://www.cnblogs.com/sandraryan/ 功能: 点击上下左右按钮,移动元素 <!DOCTYPE html> <html lang=" ...