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.效率问题:用好的.合适的算法(前端程序员要把自己当 ...
随机推荐
- oracle如何限定特定IP访问数据库
可以利用登录触发器.cmgw或者是在$OREACLE_HOME/network/admin下新增一个protocol.ora文件(有些os可能是. protocol.ora),9i可以直接修改sqln ...
- QT语言翻译
QT中多语言的实现方式: 1.代码中tr运用 2.使用工具生成ts文件 3.翻译ts文件 4.生成qm文件 5.程序加载 以下内容程序加载时放入即可. QString appPath = QCoreA ...
- 【调试】Visual Studio 调试小技巧(2)-从查看窗口得到更多信息(转载)
在使用Visual Studio开发调试程序时,我们经常需要打开查看窗口(Watch)来分析变量.有时在查看窗口显示的内容不是很直观.为了能从查看窗口的变量中得到更多的信息,我们需要一些小的技巧.下面 ...
- Oracle安装 卸载 和常见问题
Oracle的安装 全局数据库名:orcl 口令:orcl 或者以第三方工具SQLplus为例 系统用户:sys 和 system 练习账户:scott (密码:tiger) 登录账户为:sy ...
- php 练习 1
php5 echo 和 print 语句 在PHP 中, 有两种基本的输出方法:echo 和print . 在本教程中,我们几乎在每个例子中都会用到echo和print.因此,本节为您讲解更多关于这两 ...
- iOS 9适配系列教程:后台定位
http://www.cocoachina.com/ios/20150624/12200.html Demo:GitHub地址 [iOS9在定位的问题上,有一个坏消息一个好消息]坏消息:如果不适配iO ...
- RDS MySQL 8.0 语句级并发控制
RDS MySQL 8.0 语句级并发控制 背景 为了应对突发的数据库请求流量,资源消耗过载的语句访问,SQL 访问模型的变化, 并保持 MySQL 实例持续稳定运行,AliSQL 版本设计了基于语句 ...
- Android内核剖析读书笔记(1)—Framework概述
一.Framework组成 1.服务端组成 a.WindowManagerService 决定各窗口的叠放次序.隐藏或者显示窗口 b.ActivityManagerService 管理应用 ...
- re模块下的常用方法
一 : re模块的查找 findall 优先级查找 返回列表 找所有的匹配项(从大段的内容中找匹配到的项目) import re str = "qwer asdf zxcv qwer ...
- 伪静态的实现方法:IIS环境下配置
URL 静态化可以提高搜索引擎抓取,开启本功能需要对 Web 服务器增加相应的 Rewrite 规则,且会轻微增加服务器负担.本教程讲解如何在 IIS 环境下配置各个产品的 Rewrite 规则. 下 ...